私は2つの異なるコンパイラでコンパイルするプログラムを持っています:
GCC 3.4.4 PowerPC 用クロス コンパイラ
GCC 4.8.1 MinGW コンパイラ
プログラムでは、アセンブラ ディレクティブを使用してい.weak
ます。ドキュメントには次のように記載されています。
Makes a symbol with weak binding globally visible to the linker.
だから私はこのように行きます:
__asm__(".weak " "foo" "\n.set " "foo" "," "dummy_foo" "\n");
弱いものをクリアfoo
し、エイリアスを付けdummy_foo
ます。
このコードは、GCC 3.4.4 では PowerPC 用にクロス コンパイルすると正常に動作しますが、x86 ターゲット用にコンパイルすると GCC 4.8.1 では動作しません。- コードはコンパイルされますが、foo
宣言されておらずweak
、リンカーから未定義の参照が返されます。ここで何が問題なのですか?
//編集:
BSH が示唆したように、次のようにする必要があります。
__asm__(".weak " "_foo" "\n.set " "_foo" "," "_dummy_foo" "\n");
この行を宣言と同じ C ファイルに入れると、正常にfoo()
動作します。別のCファイルに入れても問題は解決しません(その後、GCC 3.4.4クロスコンパイラでは機能しますが、GCC 4.8.1では機能しません)