flto改变符号可见性
GCC -flto changing symbol visibility
我有一段很大的代码,仅在某些版本的gcc上使用-flto
编译时会产生错误。我将试着总结如下
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, no lto(很相似,只是编号不同):
00000000006162e0 B A
Ubuntu, lto
00000000006092c0 b A.2722
我的理解是B
是一个全局变量,而b
不是。
我如何确保A
被维护为一个全局变量,即使我在Ubuntu上使用-flto
?
看看这个和这个,这肯定是你正在使用的特定版本的gcc中的一个bug (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.
相关文章:
- 如何更改唯一指针向量的可见性
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 限制静态库中符号的可见性 (MSVC/Visual C++)
- 班级成员可见性C++
- 内联模板函数的可见性
- Clang 是否可以在使用可见性属性时生成导入库(不带 __declspec(dllexport))?
- std::mutex 的发布-获取可见性保证是否仅适用于关键部分?
- 符号可见性和 gcc 警告
- C++/libscreen 无法更新可见性
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- C++继承构造函数的可见性
- CRTP - 嵌套叶类类型的可见性
- C++模板 - 实例之间的通用操作和成员可见性
- 静态库中的符号可见性和操作
- 出口制造商,符号可见性,..
- 符号可见性是否保护共享库免遭滥用/破解?
- flto改变符号可见性
- 符号可见性和命名空间
- Gcc隐藏了来自包含的静态库的符号的可见性
- 符号可见性、异常、运行时错误