使用 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
需要动态内存分配并且堆由启动代码初始化。
所以基本上我想用 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
需要动态内存分配并且堆由启动代码初始化。