在我的库(ELF arm64、Android)中,我两次看到相同的损坏符号名称(名称已更改):
>> nm --format sysv libAPP.so.dbg | grep _ZL15s_symbolNameXYs
_ZL15s_symbolNameXYs|0000000003a9c758| d | OBJECT|0000000000000578| |.data.rel.ro
_ZL15s_symbolNameXYs|0000000016604940| b | OBJECT|00000000000005c0| |.bss
我认为名称必须是唯一的?这是什么原因?
我没有该库的 C/C++ 代码,如果您知道什么代码生成此代码,我会非常高兴。
谢谢
更新: 这种情况也会发生,这对我来说更没有意义:
>> nm --format sysv --defined-only libAPP.so.dbg | grep _ZL12aisomes_list
_ZL12aisomes_list |0000000000834780| r | OBJECT|0000000000000030| |.rodata
_ZL12aisomes_list |0000000000834980| r | OBJECT|0000000000000030| |.rodata
最佳答案
符号类型中的小写字母(在您的示例中为 d
、b
和 r
)表示本地符号。它们不受链接影响,因此可能在同一个二进制文件中多次出现。这没有什么问题。
此类符号的主要来源是目标文件中的本地符号。链接器只是将所有涉及的目标文件的本地符号传输到二进制文件的符号表中,而不将它们链接在一起。因此,很可能多个目标文件定义了名为 _ZL15s_symbolNameXYs
的本地符号。
关于c++ - ELF 符号名称出现两次(.data.rel.ro 和 .bss),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71408568/