c++ - ELF 符号名称出现两次(.data.rel.ro 和 .bss)

标签 c++ elf

在我的库(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

最佳答案

符号类型中的小写字母(在您的示例中为 dbr)表示本地符号。它们不受链接影响,因此可能在同一个二进制文件中多次出现。这没有什么问题。

此类符号的主要来源是目标文件中的本地符号。链接器只是将所有涉及的目标文件的本地符号传输到二进制文件的符号表中,而不将它们链接在一起。因此,很可能多个目标文件定义了名为 _ZL15s_symbolNameXYs 的本地符号。

关于c++ - ELF 符号名称出现两次(.data.rel.ro 和 .bss),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71408568/

相关文章:

c++ - 如何给 vector 数组一个大小?

C++ vector 问题

c - 内核函数 load_elf_binary 中的变量 elf_entry 是我用 readelf -h 获得的入口点吗

linux - 查找 PLT stub 的地址

c - Microsoft 编译器和 GNU 编译器在输出可执行文件大小方面的差异

c++ - 用新类型覆盖基类成员

c++ - 从一个 vector 中减去另一个 vector

c++ - 断言模板参数是迭代器/指针

c++ - 将字符串字面量的地址映射到字符串字面量,通过解析ELF C++程序

linux - .rodata 部分加载到可执行页面