C语言库函数的连接

本文介绍了在使用WDK6001.18002开发驱动时,驱动入口点的改变以及C库函数的连接方式。探讨了不同编译器如VC6、VS2005、WDK6001中/MD、/MT等链接选项与MSVCRT系列库的关系,并通过实例展示了/Oi选项如何影响外部符号解析。当未指定C库函数时,如果调用未导出的ntoskrnl库函数,会导致链接错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        以前没怎么注意这个,知道今天搞驱动的时侯才注意到!我在debugman上自问自答,这里在写的详细一点:

现在最新的WDK6001.18002,改了驱动入口点

/entry:GsDriverEntry@8

 

“Windows Vista and Windows Server 2008 x86 Checked”的驱动连接了

1>E:/WINDDK/6001~1.180/lib/wlh/i386/BufferOverflowK.lib
1>E:/WINDDK/6001~1.180/lib/wlh/i386/ntoskrnl.lib
1>E:/WINDDK/6001~1.180/lib/wlh/i386/hal.lib
1>E:/WINDDK/6001~1.180/lib/wlh/i386/wmilib.lib

用WDK(6001.18002)编译的,但其实的编译器是vs2005的!

 

VC6的C库函数连接
/MD link with MSVCRT.LIB                 /MDd link with MSVCRTD.LIB debug lib
/ML link with LIBC.LIB                   /MLd link with LIBCD.LIB debug lib
/MT link with LIBCMT.LIB                 /MTd link with LIBCMTD.LIB debug lib

 

VS2008、VS2005、WDK6001的C库函数连接
/MD 与 MSVCRT.LIB 链接
/MT 与 LIBCMT.LIB 链接                  /MDd 与 MSVCRTD.LIB 调试库链接
/MTd 与 LIBCMTD.LIB 调试库链接

其实VC6的很多参数,到后来都有改动!!

 

C库函数是由编译时(CL)的上面几个参数指定的(这几乎被ms定死)

/Zl  从.obj 文件中移除默认库名(仅限 x86),VC6中没有 

/NODEFAULTLIB    //Link的时侯忽略obj中指定的默认库

 

但奇怪的是编译驱动的时侯没有指定任何C库函数,其实这里真正的奥秘是:

/Oi  生成内部函数  

弄了个例子,(没有加/Oi
正在链接...
1>11.obj : error LNK2019: 无法解析的外部符号 _memcmp,该符号在函数 _main 中被引用
1>11.obj : error LNK2019: 无法解析的外部符号 __RTC_CheckEsp,该符号在函数 _main 中被引用
1>11.obj : error LNK2001: 无法解析的外部符号 __RTC_Shutdown
1>11.obj : error LNK2001: 无法解析的外部符号 __RTC_InitBase
1>LINK : error LNK2001: 无法解析的外部符号 _mainCRTStartup


正在链接...(加/Oi)
1>11.obj : error LNK2001: 无法解析的外部符号 __RTC_Shutdown
1>11.obj : error LNK2001: 无法解析的外部符号 __RTC_InitBase
1>LINK : error LNK2001: 无法解析的外部符号 _mainCRTStartup
1>./Debug/11.exe : fatal error LNK1120: 3 个无法解析的外部命令

豁然开朗:

_disable
_outp
fabs
strcmp
_enable
_outpw
labs
strcpy
_inp
_rotl
memcmp
strlen
_inpw
_rotr
memcpy

_lrotl
_strset
memset

_lrotr
abs
strcat


可以intrinsic那么多函数啊,,哈哈……

其实用IDA分析obj文件也能看出点名堂来……

 

换句话说,如果调用上面名单之外的库函数,而ntosknrl又没导出的,就不行了…………

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值