我有一大段代码,仅在某些版本的 gcc 上使用 -flto
编译时会产生错误。我将尝试总结如下
在文件 1.h 中
extern char A [100];
在文件 1.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(arch 相似,编号不同):
00000000006162e0 B A
Ubuntu,lto
00000000006092c0 b A.2722
我的理解是 B
是一个全局变量,而 b
不是。
即使在 Ubuntu 上使用 -flto
,我如何确保 A
保持为全局变量?
最佳答案
查看this和 this ,这很可能是您正在使用的特定 gcc 版本中的错误(gcc 4.8.4 与 Ubuntu 14.04 捆绑在一起)。
使用问题中的代码片段,
我能够在运行 Ubuntu 14.04 的机器上重现该行为。
A simple workaround for this is to explicitly mark the symbol in question as
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.
关于c++ - GCC -flto 更改符号可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31690598/