使用-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,但不包含代码或调用静态初始化。
答案 0 :(得分:9)
<强> -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.