GCC -flto更改符号可见性

时间:2015-07-29 03:08:37

标签: c++ c gcc optimization compilation

我有一大段代码,只在某些版本的gcc上使用-flto编译时会产生错误。我将尝试总结如下

在file1.h

extern char A [100];

在file1.c

#include "file1.h"
char A[100];

我还有一些使用变量A的c ++代码。 C ++代码被编译为.o文件,然后用

之类的东西编译整个文件
gcc file1.c cpp.o

在archlinux(5.2.0)上使用gcc版本,无论是否有-flto都没有问题。但是在Ubuntu 14.04(4.8.4)上使用gcc时,当使用-flto编译代码时,A将成为局部变量。我用nm证实了这一点:

这些是nm a.out对于有问题的变量的输出

Ubuntu,没有lto(拱门类似,有不同的编号):

00000000006162e0 B A

Ubuntu,lto

00000000006092c0 b A.2722

我的理解是B用于全局变量,b不是。

即使我在Ubuntu上使用A,如何确保将-flto维护为全局变量?

1 个答案:

答案 0 :(得分:2)

查看thisthis,它肯定是您正在使用的特定gcc版本中的一个错误(gcc 4.8.4与Ubuntu 14.04捆绑在一起)。

使用问题中的代码段,
我能够在运行Ubuntu 14.04的机器上重现这种行为。

  

一个简单的解决方法是明确将有问题的符号标记为used

file1.c char A[100];

file2.c __attribute__((used)) char A[100];

gcc file1.c -o file1-default.o
nm file1-default.o | grep "A$"
0000000000601060 B A               <-- symbol is a global.

gcc file1.c -flto -o file1-flto.o
nm file1-flto.o | grep "A$"
0000000000601060 b A.2385          <-- symbol updated to a local.

gcc file2.c -flto -o file2.o
nm file2.o | grep "A$"
0000000000601060 B A               <-- symbol retained as global.