2012-04-12 112 views
9

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

有没有解决方法可以使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

试试这个'G ++ -o测试./crti.o ./crtn.o test.o轮候册,-nodefaultlibs -nostartfiles'与看到您的使用,我觉得你只希望你的启动文件被包含在内,并且你似乎可以使用标准库中的其他库文件? – 2012-04-12 08:56:37

+0

@Pavan:我试过'-Wl,-nodefaultlibs -Wl,-nostartfiles',但是然后libc-_init被编译器包含。用法适用于IBM Cell SPU - 我需要自己的启动代码来设置所有内容,并且不使用libc函数,但仍需要静态构造函数才能调用。 – Thomas 2012-04-12 09:06:51

+0

我不熟悉C++,所以我不明白你的意思,但仍然需要静态构造函数来调用“?你能告诉我一些例子吗?我一直在想静态库。 – 2012-04-12 09:19:10

回答

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

这帮了很多,谢谢。 – Thomas 2012-04-12 08:14:46

+0

使用-nodefaultlibs包含并调用了静态初始化的代码,但后来我看不到使用我自己的.init/_start代码的方法。这仍然是可能的吗? – Thomas 2012-04-12 08:37:44

+0

你使用过'-nostartfiles'吗? – 2012-04-12 08:38:09