-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から
はこの 'G ++ -oテスト./crti.o ./crtn.o test.o -Wl、-nodefaultlibs -nostartfiles'を試してみて、私はあなたを感じるあなたの利用状況を見てあなたのスタートアップファイルをインクルードしたいのですが、標準ライブラリの他のライブラリを使っても問題ないでしょうか? –
@Pavan: '-Wl、-nodefaultlibs -Wl、-nostartfiles'を試しましたが、libc-_initはコンパイラに含まれています。使用方法はIBM Cell SPUです - 私は自分自身のスタートアップコードが必要ですが、libc関数を使わずに静的なコンストラクタを呼び出す必要があります。 – Thomas
私はC++に精通していませんので、 "静的コンストラクタが呼び出される必要があります"ということを意味するものはありません。いくつかの例を教えてもらえますか?私は静的なライブラリを常に考えていました。 –