我在Odroid-XU3上用gcc / g ++版本4.8.2和clang版本3.5编译了一个C ++ HelloWorld。我还写了一个C HelloWorld进行比较。
g++ -static -o HelloWorld hello.cc
readelf -h HelloWorld
显示以下入口点地址:
HelloWorld: 0x8be5
HelloClang: 0x8c45
HelloC: 0x88b5
这些是奇数地址。 Thumb有奇数地址,所以这与Thumb有关吗?
此外,objdump -lSd HelloWorld
在_start
显示0x8be4
符号,该符号看起来像“正确”地址。
为什么要显示这两个工具的不同地址?
答案 0 :(得分:2)
是的地址很奇怪,因为它们是Thumb功能,这是一个简单的问题,但是为什么两个工具报告的方式与我不同是一个很好的问题。
readelf
故意不使用BFD(与objdump不同),主要用于验证其他工具。
Here:
readelf和objdump之间的区别:两个程序都是 能够显示ELF格式文件的内容,为什么呢 binutils项目有两个文件翻转程序吗?
原因是 objdump通过世界的BFD过滤器看到一个ELF文件;如果是BFD 有一个错误,例如,它不同意机器常数 e_flags,那么它将保持在内部的可能性很大 是一致的。链接器将其视为BFD方式,objdump将其视为BFD 方式,GAS认为它是BFD方式。需要一种工具来寻找 文件实际上说的是什么。
这就是readelf计划的原因 没有链接到BFD库 - 它作为一个独立的存在 程序,以帮助验证BFD的正确工作。
还有 readelf可以提供有关ELF文件的更多信息的情况 比objdump提供的。特别是它可以显示DWARF 调试信息(目前)objdump不能。