g ++,静态初始化和-nostdlib

时间:2012-04-12 07:48:01

标签: gcc g++ static-initialization

使用-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,但不包含代码或调用静态初始化。

1 个答案:

答案 0 :(得分:9)

来自gcc linker docs

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