ata*_*lor 68
如果使用-nostdlib编译代码,则无法调用任何C库函数(当然),但您也无法获得常规的C引导代码.特别是,linux上程序的真正入口点不是main(),而是一个名为_start()的函数.标准库通常提供运行一些初始化代码的版本,然后调用main().
尝试用gcc -nostdlib编译它:
void _start() {
/* main body of program: call main(), etc */
/* exit system call */
asm("movl $1,%eax;"
"xorl %ebx,%ebx;"
"int $0x80"
);
}
Run Code Online (Sandbox Code Playgroud)
_start()函数应始终以对exit(或其他非返回系统调用,如exec)的调用结束.上面的示例直接使用内联汇编调用系统调用,因为通常的exit()不可用.
最简单的方法是将C代码编译为目标文件(gcc -c
获取一些*.o
文件),然后将它们直接链接到链接器(ld
).您必须将目标文件与一些额外的目标文件链接,例如/usr/lib/crt1.o
为了获得可操作的可执行文件(在入口点之间,如内核所见,并且main()
函数,还有一些工作要做).要知道要链接什么,请尝试使用glibc链接gcc -v
:这应该显示通常可执行文件中的内容.
你会发现gcc生成的代码可能与一些隐藏的函数有一些依赖关系.他们中的大多数都在libgcc.a
.另外,也可以隐藏的号召性memcpy()
,memmove()
,memset()
和memcmp()
,这是在libc中,所以你可能必须提供自己的版本(这并不难,只要你不是太挑剔的性能至少).
如果你看一下生产的组件(使用标志),事情可能会更清楚-S
.
归档时间: |
|
查看次数: |
32032 次 |
最近记录: |