我有两个简单的源文件
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 bug吗?我需要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)
答案 0 :(得分:0)
这已被确认为gcc中的错误。某些选项由LTO过滤,可能会更改二进制输出。
正在gcc的bugzilla中跟踪它:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=61123
它也在裸机ARM启动板项目中被跟踪: