我有一大段代码,只在某些版本的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
维护为全局变量?
答案 0 :(得分:2)
查看this和this,它肯定是您正在使用的特定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.