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

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

所以基本上我想用 gcc 静态编译一个 c 程序,我希望它能够 link c stdlib 函数,但我希望它从 main 开始,而不包括 _start 函数以及在 main 之前发生的 libc init 东西。通常当你想编译一个没有 _start 的程序时,你 运行 gcc 带有 -nostdlib 标志,但我希望也能够包含来自 stdlib 的代码,而不是 libc init。有什么办法吗?

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

提前致谢

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

-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.

在 low-level bare-metal 编程中经常使用此选项以准确控制正在发生的事情。

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