感觉写一些恶意程序会有点用
用cl 编译一个东西,啥头文件都不引用,随便用个反汇编器打开,一看,一大堆代码,而你仅仅写了一个main函数.
why ?
答案是编译的时候自动连接到default lib 了,会启动crt 代码,完成一些初始化工作
,具体可见源代码
这里说明一下,exe文件进内存后执行的第一条指令由pe文件的EntryPoint 来指明.
咋摆脱default lib 呢
link 链接器上做文章, cl m.c /link /nodefaultlib
D:/asm/1>cl m.c /link /NODEFAULTLIB
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
m.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
/out:m.exe
/NODEFAULTLIB
m.obj
LINK : error LNK2001: unresolved external symbol _mainCRTStartup
m.exe : fatal error LNK1120: 1 unresolved externals
这样以后,会报错,无法链接到_mainCRTStartup
我们可以指定一个入口点, /entry
D:/asm/1>cl m.c /link /NODEFAULTLIB /entry:main
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
m.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
/out:m.exe
/NODEFAULTLIB
/entry:main
m.obj
一个例子,
D:/asm/1>cl m.c /link /NODEFAULTLIB /entry:main kernel32.lib
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
m.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
/out:m.exe
/NODEFAULTLIB
/entry:main
kernel32.lib
m.obj
编译以后看导入表,没有多余的函数,很简洁.
不过不用default lib的代价是c语言库函数是没法用了,像printf这种,但是,windows下完全可以用api来替代! 比如上面用lstrlen来代替了strlen ,链接的是写上kernel32.lib ,api 文档上注明了每个api 引用的库,下面是msdn 的截图
Function Information
Minimum DLL Version kernel32.dll Header Declared in Winbase.h, include Windows.h Import library Kernel32.lib Minimum operating systems Windows 95, Windows NT 3.1 Unicode Implemented as ANSI and Unicode versions.