c++ - GCC -flto 更改符号可见性

标签 c++ c gcc optimization compilation

我有一大段代码,仅在某些版本的 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 保持为全局变量?

最佳答案

查看thisthis ,这很可能是您正在使用的特定 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.cchar 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/

相关文章:

c - RPI 通过 PWM 驱动伺服(接线/C 编程)

c - pthread条件变量和mutex,程序出现死锁

c - 在结构中动态分配一个 int 数组

c++ - GCC 4.9 的 unordered_set 和 std::move

c++ - C++ 中的对象所有权(MVC 模式)

c++ - 指针删除崩溃

c++ - 在未完成的类层次结构中的 "final"类上使用虚拟继承

c++ - 是否有不关心结构/类布局的编译指示?如果不是,为什么?

c++ - 如何修复 Wunknown-pragmas gcc 警告

c - 是否存在静态 pthread 自旋锁初始化?