user@pc ~/hiddensymbols
% cat main.cpp
__attribute__((visibility ("hidden"))) int f_b1(void){
return 21 ;
}
__attribute__((visibility ("hidden"))) int f_b3(void){
return f_b1() ;
} user@pc ~/hiddensymbols
% g++ -shared main.cpp
user@pc ~/hiddensymbols
% nm -C ./a.out
.............
000000000000055a t f_b1()
0000000000000565 t f_b3()
我想知道,将这两个符号留在DSO中有什么意义?我知道动态链接器不能使用它们,但是为什么要将它们添加到某些隐藏的符号表中呢?目的是什么?
最佳答案
链接器发出目标文件时,它将记录每个符号的名称和地址,而不管其可见性如何(在.symtab
部分中,可以使用readelf --symbols <elf-file>
进行转储)。即使没有可用的调试信息,它也用于调试以显示符号名称。在正常执行期间,此部分不会加载/映射到地址空间中。
隐藏的符号不能用来解析其他目标文件中的符号,就像用static
关键字标记的符号一样。如有必要,可以使用strip
实用程序将其删除。
关于c++ - 为什么仍将隐藏符号添加到DSO,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50472938/