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 для запуска с нуля: