gpt4 book ai didi

不使用 libc 编译

转载 作者:太空狗 更新时间:2023-10-29 16:18:05 31 4
gpt4 key购买 nike

我想在没有 (g)libc 的情况下编译我的 C 代码。如何停用它以及哪些功能依赖于它?

我试过 -nostdlib 但它没有帮助:代码是可编译和运行的,但我仍然可以在我的可执行文件的 hexdump 中找到 libc 的名称。

最佳答案

如果您使用-nostdlib 编译您的代码,您将无法调用任何C 库函数(当然),但您也不会获得常规的C Bootstrap 代码。特别是,Linux 上程序的真正入口点不是 main(),而是一个名为 _start() 的函数。标准库通常提供一个运行一些初始化代码的版本,然后调用 main()

尝试用 gcc -nostdlib -m32 编译它:

// Tell the compiler incoming stack alignment is not RSP%16==8 or ESP%16==12
__attribute__((force_align_arg_pointer))
void _start() {

/* main body of program: call main(), etc */

/* exit system call */
asm("movl $1,%eax;"
"xorl %ebx,%ebx;"
"int $0x80"
);
__builtin_unreachable(); // tell the compiler to make sure side effects are done before the asm statement
}

_start() 函数应始终以调用 exit(或其他非返回系统调用,例如 exec)结束。由于通常的 exit() 不可用,上面的示例直接使用内联汇编调用系统调用。

关于不使用 libc 编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2548486/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com