GCC (Sourcery codebench 2013.11) оптимизация времени ссылки без учета -fno-short-enums

У меня есть два тривиальных исходных файла

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-size:

$ 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

Это, конечно, выглядит как нечто удаленное -fno-short-enums от COLLECT_GCC_OPTIONS во время шага LTO. Я подозреваю, что это может быть общая проблема gcc, и не ограничивается сборкой Sourcery.

Это ошибка GCC? Мне нужен gcc для генерации объектных файлов без коротких перечислений, чтобы связываться с определенными библиотеками, созданными с 32-битными перечислениями. Есть ли способ достичь этой цели без восстановления gcc из исходного кода?

Обновление: я только что подтвердил точно такое же поведение в Ubuntu 14.04 с arm-none-eabi-gcc 4.8.2-14ubuntu1 + 6toolchain ( http://packages.ubuntu.com/trusty/devel/gcc-arm-none-eabi)

1 ответ

Решение

Это было подтверждено как ошибка в gcc. Некоторые параметры фильтруются LTO, что может изменить двоичный вывод.

Это отслеживается в bugzilla gcc:

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

Это отслеживается и в проекте ARM для запуска с нуля:

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

Другие вопросы по тегам