1

私は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では機能しません)

4

1 に答える 1

1

MinGW では、シンボルの前にアンダースコア が付きます。次の_fooように変更する必要があります。

__asm__(".weak " "_foo" "\n.set " "_foo" "," "_dummy_foo" "\n");

または、代わりにwith属性を使用することを検討してください。 __attribute__((weak, alias("dummy_foo")))foo

于 2013-11-04T11:43:05.360 に答える