【问题标题】:GCC (Sourcery codebench 2013.11) link time optimization ignoring -fno-short-enumsGCC(Sourcery codebench 2013.11)链接时间优化忽略-fno-short-enums
【发布时间】:2014-04-19 18:58:44
【问题描述】:

我有两个微不足道的源文件

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 步骤中从 COLLECT_GCC_OPTIONS 中删除了 -fno-short-enums 的内容。我怀疑这可能是一个普遍的 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) 确认了完全相同的行为

【问题讨论】:

    标签: gcc linker arm eabi lto


    【解决方案1】:

    这已被确认为 gcc 中的一个错误。某些选项被 LTO 过滤,可能会改变二进制输出。

    它正在 gcc 的 bugzilla 中进行跟踪:

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

    裸机 ARM 启动板项目也在跟踪它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 2015-07-10
      • 2023-02-04
      • 1970-01-01
      • 2011-01-16
      相关资源
      最近更新 更多