代码之家  ›  专栏  ›  技术社区  ›  Ibraim Ganiev

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

  •  0
  • Ibraim Ganiev  · 技术社区  · 7 年前
    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中有什么意义?我知道动态链接器不能使用它们,但是为什么要将它们添加到某个隐藏的符号表中呢?这样做的目的是什么?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Maxim Egorushkin    7 年前

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

    隐藏符号不能用于解析其他对象文件中的符号,就像用 static 关键字。你可以把它们剥掉 strip 必要时可使用。