2012-04-12 35 views
9

-nostdlibでコンパイル/リンクすると、.init/.finiセクションで独自のcrti.sとcrtn.sを追加しても、静的初期化が防止されるようです。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を使用できますが、コードや静的初期化を呼び出すことはできません。 gcc linker docsから

+0

はこの 'G ++ -oテスト./crti.o ./crtn.o test.o -Wl、-nodefaultlibs -nostartfiles'を試してみて、私はあなたを感じるあなたの利用状況を見てあなたのスタートアップファイルをインクルードしたいのですが、標準ライブラリの他のライブラリを使っても問題ないでしょうか? –

+0

@Pavan: '-Wl、-nodefaultlibs -Wl、-nostartfiles'を試しましたが、libc-_initはコンパイラに含まれています。使用方法はIBM Cell SPUです - 私は自分自身のスタートアップコードが必要ですが、libc関数を使わずに静的なコンストラクタを呼び出す必要があります。 – Thomas

+0

私はC++に精通していませんので、 "静的コンストラクタが呼び出される必要があります"ということを意味するものはありません。いくつかの例を教えてもらえますか?私は静的なライブラリを常に考えていました。 –

答えて

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

これは、多くの助け、ありがとう。 – Thomas

+0

-nodefaultlibsを使用すると、静的な初期化のコードがインクルードされて呼び出されますが、独自の.init/_startコードを使用する方法はありません。それはまだ可能ですか? – Thomas

+0

'-nostartfiles'を使いましたか? –

関連する問題