编译 c 程序,可以访问 stdlib 函数,但没有 _start 和所有 libc init 函数,使用 gcc

Compile c program with access to stdlib functions, but without _start and all of the libc init functions using gcc

提问人:Dyskord 提问时间:5/10/2022 更新时间:5/10/2022 访问量:266

问:

所以从本质上讲,我想用 gcc 静态编译一个 c 程序,我希望它能够链接 c stdlib 函数,但我希望它从 main 开始,而不是包括函数以及 main 之前发生的 libc init 东西。通常,当您想在没有 的情况下编译程序时,您可以使用标志运行 gcc,但我希望也能够包含来自 stdlib 的代码,而不是 libc init。有什么办法可以做到这一点吗?_start_start-nostdlib

我知道这可能会导致很多问题,但对于我的用例,我实际上并没有运行 c 程序本身,所以这样做是有意义的。

提前致谢

C GCC 标准 libc

评论

1赞 Yunnosch 5/10/2022
您想链接(并可能调用/执行)stdlib 代码,同时破坏其前提条件和“假设”?确定?我们可能正在研究一个 meta.stackexchange.com/questions/66377/what-is-the-xy-problem
1赞 the busybee 5/10/2022
您是否尝试添加适当的链接器选项?与任何其他库一样,只有未解析的引用才会从中提取模块。-lc
1赞 Guillaume Petitjean 5/10/2022
@Yunnosch可能有完全合法的理由不使用 libc 的启动文件,并且仍然想使用一些 libc 函数。例如,如果你想使用 libm(数学库),它需要一些 libc 符号。与 -nostdlib -lm -lc 链接效果很好
0赞 Yunnosch 5/10/2022
那么有 stdlib 的一个子集可以在不执行启动的情况下使用?还行。
0赞 Dyskord 5/11/2022
作为背景,我正在尝试编写一个可以从任意 c 代码创建 shellcode 的程序。Shellcode 劫持了另一个进程的内存空间,因此它不需要自己进行 libc 初始化。

答:

1赞 Guillaume Petitjean 5/10/2022 #1

该选项告诉链接器不使用启动文件(即在 之前执行的代码)。-nostdlibmain

-nostdlib

Do not use the standard system startup files or libraries when linking. 
No startup files and only the libraries you specify are
passed to the linker, and options specifying linkage of the system
libraries, such as -static-libgcc or -shared-libgcc, are ignored.

The compiler may generate calls to memcmp, memset, memcpy and memmove. 
These entries are usually resolved by entries in libc. These
entry points should be supplied through some other mechanism when this
option is specified.

在低级裸机编程中经常使用此选项,以便准确控制正在发生的事情。

您仍然可以通过使用 来使用 libc 的功能。但是,请记住,某些 libc 函数依赖于启动代码。例如,在某些实现中,需要动态内存分配,堆由启动代码初始化。-lcprintf

评论

0赞 Dyskord 5/11/2022
啊,好的,谢谢,这就是我一直在寻找的,我想会完成我的任务-nostdlib -lc