关于link的一些东西, 摆脱default lib

感觉写一些恶意程序会有点用

 

用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 Versionkernel32.dll
HeaderDeclared in Winbase.h, include Windows.h
Import libraryKernel32.lib
Minimum operating systemsWindows 95, Windows NT 3.1
UnicodeImplemented as ANSI and Unicode versions.

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值