unix 如何了解符号在目标文件中的可见性

oknrviil  于 2022-11-23  发布在  Unix
关注(0)|答案(2)|浏览(165)

符号的可见性(来自__ attribute __(visibility(“...”))和-fvisibility)可从so文件中获知

nm -C lib.so

T是隐藏的,T是导出的(即默认)。但如何直接从目标文件中获得这些信息呢?

nm -C lib.o

对于非C静态符号,无论可见性如何,都将始终打印T。

bqf10yzr

bqf10yzr1#

可见性与符号是局部的还是全局的不同(这是小写/大写字母所描述的)。隐藏的符号仍然可以有外部链接,即它不限于翻译单元。
我认为nm没有显示可见性的选项,但您可以使用其中任何一个

objdump -Ct lib.o

如果符号被隐藏或

readelf -s lib.o

其具有用于可见度(DEFAULT/HIDDEN)的列。

5t7ly7z5

5t7ly7z52#

我认为visibility是共享库的概念,而不是目标文件的概念。
下面是一个测试来验证它。

//math.cpp
__attribute__((visibility("default"))) int bbbb;
__attribute__((visibility("hidden"))) int aaaa;
  • 如果我们把它编译成一个目标文件,这两个符号是全局的(S是大写的,表示它是全局的)
> g++ -c math.c
> nm math.o
000000000000007c S _aaaa
0000000000000078 S _bbbb
  • 如果我们把它编译到一个共享库中,我们会看到隐藏的符号(aaaa)被标记为本地的。
> g++ -shared -fPIC -o libmath.so math.cpp
> nm libmath.so
0000000000004004 s _aaaa
0000000000004000 S _bbbb

相关问题