再次回想C库函数链接

再次回想C库函数链接
2010年06月07日
  最近又开始瞎折腾起来了,有点弄不清对C库的链接。 The following libraries contain the C run-time library functions.
  
  The single-threaded CRT (libc.lib, libcd.lib) (formerly the /ML or /MLd options) is no longer available. Instead, use the multithreaded CRT. See Multithreaded Libraries Performance . If you link your program from the command line without a compiler option that specifies a C run-time library, the linker will use LIBCMT.LIB. This is different from previous versions of Visual C++ which used LIBC.LIB, the single-threaded library, instead. 上面一段摘自最新的MSDN ,要链接的C库是由Option指定,但是这是编译器选项,链接器并不知道。其实编译器会根据Option吧对应的库写入obj文件,如-defaultlib:LIBCD -defaultlib:OLDNAMES(用任意编辑器打开,如果用IDA打开obj文件就更明白了)。#pragma comment(lib/linker……)等其实也都写入了obj文件的那个位置,链接器会读取那里的数据作为参数传入。终于清楚些了,O(∩_∩)O哈哈~
  忽然又想起一个问题,很多C库函数都要调用win32的API,如fopen()、malloc()等,由于这些API包含在C运行时库(CRT)中,所以在链接时并不用手动指定它们的lib库,那么链接器又是如何链接CRT中的win32 API的呢?那一个VC6下最简单的一个C静态库libc.lib(单线程)为例,lib文件其实是由很多obj文件组成的,可以用libx把它解开(网上搜),也可以直接用IDA查看,在crt0init.obj中可以看到defaultlib:kernel32.lib,对应的源文件\VC98\CRT\SRC\CRT0INIT.C是这样的: #pragma comment(linker, "/merge:.CRT=.data") #pragma comment(linker, "/defaultlib:kernel32.lib") #if !(!defined (_MT) && !defined (_DEBUG)) #pragma comment(linker, "/disallowlib:libc.lib") #endif /* !(!defined (_MT) && !defined (_DEBUG)) */ #if !(!defined (_MT) && defined (_DEBUG)) #pragma comment(linker, "/disallowlib:libcd.lib") #endif /* !(!defined (_MT) && defined (_DEBUG)) */ #if !(defined (_MT) && !defined (_DEBUG)) #pragma comment(linker, "/disallowlib:libcmt.lib") #endif /* !(defined (_MT) && !defined (_DEBUG)) */ #if !(defined (_MT) && defined (_DEBUG)) #pragma comment(linker, "/disallowlib:libcmtd.lib") #endif /* !(defined (_MT) && defined (_DEBUG)) */ #pragma comment(linker, "/disallowlib:msvcrt.lib") #pragma comment(linker, "/disallowlib:msvcrtd.lib") 现在一切都明朗了……
  附上我以前写的两篇文章:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值