14

编译/链接 with-nostdlib似乎可以防止静态初始化,即使我添加自己的 crti.s 和 crtn.s 与.init/.fini部分。

是否有解决方法使 g++ 生成插入.init或我可以手动调用的静态初始化代码?

这是我尝试过的:

g++ -o test.o -c -fno-use-cxa-atexit test.cc  # has _start (entry point) 
                                              #   that calls _init and _main
as -o crti.o crti.s      # has _init in section .init
as -o crtn.o crtn.s
g++ -o test ./crti.o test.o -nodefaultlibs -nostartfiles ./crtn.o

-nodefaultlibs单独包括静态初始化代码和调用,但强制使用 libc-_start/_init。

-nodefaultlibs -nostartfiles允许我使用自己的 _start / _init,但不包括代码或调用静态初始化。

4

1 回答 1

15

gcc 链接器文档

-nostdlib

链接时不要使用标准的系统启动文件或库。没有启动文件,只有您指定的库将传递给链接器,并且指定系统库链接的选项(例如 -static-libgcc 或 -shared-libgcc)将被忽略。

因此使用,

-nodefaultlibs

链接时不要使用标准系统库。只有您指定的库将被传递给链接器,指定系统库链接的选项,例如 -static-libgcc 或 -shared-libgcc 将被忽略。标准启动文件正常使用,除非使用 -nostartfiles。编译器可以生成对 memcmp、memset、memcpy 和 memmove 的调用。这些条目通常由 libc 中的条目解析。指定此选项时,应通过某些其他机制提供这些入口点。

也试试,

g++ -Wl, -static

-Wl      passes the next command on to the linker
-static  On systems that support dynamic linking, this prevents linking with 
         the shared libraries. On other systems, this option has no effect.
于 2012-04-12T07:57:47.647 回答