C++ 为什么仍将隐藏符号添加到DSO

C++ 为什么仍将隐藏符号添加到DSO,c++,gcc,linker,shared-libraries,C++,Gcc,Linker,Shared Libraries,我想知道,在DSO中留下这两个符号有什么意义?我知道动态链接器不能使用它们,但为什么要将它们添加到一些隐藏的符号表中呢?这样做的目的是什么?当链接器发出一个对象文件时,它会记录每个符号的名称和地址,而不管其可见性如何(在.symtab部分,您可以使用readelf--symbols转储该部分)。它用于调试显示符号名称,即使没有可用的调试信息。在正常执行期间,此节不会加载/映射到地址空间 隐藏符号不能用于解析来自其他对象文件的符号,就像用static关键字标记的符号一样。如果需要,您可以使用str

我想知道,在DSO中留下这两个符号有什么意义?我知道动态链接器不能使用它们,但为什么要将它们添加到一些隐藏的符号表中呢?这样做的目的是什么?

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


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

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


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

但在这里,它将这些符号保留在共享库中,不会为运行时保留任何有用的信息。@IbraimGaniev这些符号用于调试,以显示符号名称,即使没有可用的调试信息。但在这里,它将这些符号保留在共享库中,它没有为运行时保留任何有用的信息。@IbraimGaniev这些符号用于调试以显示符号名称,即使没有可用的调试信息。
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()