1

簡単なソース ファイルが 2 つある

obj1.cc:

int x(int y)
{
    return y - 10;
}

obj2.cc:

int foo(int bar)
{
    return bar*10;
}

Sourcery codebench lite 2013.11 を使用しています。

$ arm-none-eabi-g++ --version
  arm-none-eabi-g++.exe (Sourcery CodeBench Lite 2013.11-24) 4.8.1

を使用して各ソースファイルをコンパイルします

$ arm-none-eabi-g++.exe -fno-short-enums -mcpu=arm946e-s -c obj1.cc -o obj1.o  -Os -flto
$ arm-none-eabi-g++.exe -fno-short-enums -mcpu=arm946e-s -c obj2.cc -o obj2.o  -Os -flto

-flto なしでそれらをリンクすると、リンク時の最適化が呼び出されず、int サイズの列挙型を持つとマークされたオブジェクト ファイルが取得されます。

$ arm-none-eabi-g++.exe -fno-short-enums -mcpu=arm946e-s obj1.cc obj2.cc -Wl,-Ur -o partial_link_result.o -nostdlib -Os
$ arm-none-eabi-readelf.exe -a partial_link_result.o | grep enum
  Tag_ABI_enum_size: int

しかし、単純に-fltoリンカーの呼び出しに追加すると、出力には小さな列挙型があると主張されます。

$ arm-none-eabi-g++.exe -fno-short-enums -mcpu=arm946e-s obj1.cc obj2.cc -Wl,-Ur -o partial_link_result.o -nostdlib -Os -flto
$ arm-none-eabi-readelf.exe -a partial_link_result.o | grep enum
  Tag_ABI_enum_size: small

でリンク ステップを実行すると-v、gcc が lto ステージに到達したときに次のように表示されます。

gcc version 4.8.1 (Sourcery CodeBench Lite 2013.11-24)
COLLECT_GCC_OPTIONS='-c' '-fexceptions' '-mcpu=arm946e-s' '-mcpu=arm946e-s' '-nostdlib' '-Os' '-v' '-D' '__CS_SOURCERYGXX_MAJ__=2013' '-D' '__CS_SOURCERYGXX_MIN__=11' '-D' '__CS_SOURCERYGXX_REV__=24' '-dumpdir' './' '-dumpbase' 'partial_link_result.o.wpa' '-fltrans-output-list=C:\Users\BOBBY_~1\AppData\Local\Temp\ccrOoESe.ltrans.out' '-fwpa' '-fresolution=C:\Users\BOBBY_~1\AppData\Local\Temp\cccj0syW.res' '-D' '__CS_SOURCERYGXX_MAJ__=2013' '-D' '__CS_SOURCERYGXX_MIN__=11'
 '-D' '__CS_SOURCERYGXX_REV__=24'
 c:/program files (x86)/sourcery/lib/gcc/../../libexec/gcc/arm-none-eabi/4.8.1/lto1.exe -quiet -dumpdir ./ -dumpbase partial_link_result.o.wpa -mcpu=arm946e-s -mcpu=arm946e-s -auxbase ccQXQ7aT -Os -version -fexceptions -fltrans-output-list=C:\Users\BOBBY_~1\AppData\Local\Temp\ccrOoESe.ltrans.out -fwpa -fresolution=C:\Users\BOBBY_~1\AppData\Local\Temp\cccj0syW.res @C:\Users\BOBBY_~1\AppData\Local\Temp\ccDElvyi

LTOステップ中に何かが取り除か-fno-short-enumsれたように見えます。COLLECT_GCC_OPTIONSこれは一般的な gcc の問題であり、Sourcery ビルドに限定されないのではないかと思います。

これはgccのバグですか?32ビット列挙型で構築された特定のライブラリにリンクするために、短い列挙型なしでオブジェクトファイルを生成するにはgccが必要です。ソースから gcc を再構築せずにこの目標を達成する方法はありますか?

更新: arm-none-eabi-gcc 4.8.2-14ubuntu1+6toolchain ( http://packages.ubuntu.com/trusty/devel/gcc-arm-none-eabi ) を使用して、Ubuntu 14.04 でまったく同じ動作を確認しました。)

4

1 に答える 1

0

これは gcc のバグとして確認されています。特定のオプションは、バイナリ出力を変更する可能性のある LTO によってフィルター処理されます。

gcc の bugzilla で追跡されています。

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=61123

ベアメタル ARM ランチパッド プロジェクトでも追跡されています。

https://bugs.launchpad.net/gcc-arm-embedded/+bug/1315810

于 2014-05-13T01:15:34.047 に答える