为什么隐藏的符号仍然添加到 DSO 中

Why hidden symbols are still added to DSO

本文关键字:添加 DSO 隐藏 符号 为什么      更新时间:2023-10-16
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 中有什么意义?我知道动态链接器不能使用它们,但是为什么将它们添加到某个隐藏的符号表中呢?这样做的目的是什么?

当链接器发出对象文件时,它会记录每个符号的名称和地址,而不管其可见性如何(在可以使用readelf --symbols <elf-file>转储.symtab部分中(。它用于调试以显示符号名称,即使没有可用的调试信息。在正常执行期间,此部分不会加载/映射到地址空间。

隐藏符号不能用于解析其他对象文件中的符号,就像用static关键字标记的符号一样。如有必要,您可以使用strip实用程序将它们剥离出来。