以前没怎么注意这个,知道今天搞驱动的时侯才注意到!我在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又没导出的,就不行了…………