【问题标题】:Why hidden symbols are still added to DSO为什么隐藏符号仍会添加到 DSO
【发布时间】:2018-05-22 16:57:34
【问题描述】:
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 中有何意义?我知道动态链接器不能使用它们,但是为什么它们被添加到一些隐藏的符号表中呢?这样做的目的是什么?

【问题讨论】:

    标签: c++ gcc linker shared-libraries


    【解决方案1】:

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

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

    【讨论】:

    • 但是在这里它将这些符号留在共享库中,它没有为运行时保留任何有用的信息。
    • @IbraimGaniev 这些符号用于调试以显示符号名称,即使没有可用的调试信息。
    猜你喜欢
    • 2021-08-25
    • 2014-07-04
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    相关资源
    最近更新 更多