我在gdc / g ++版本4.8.2和clang版本3.5的Odroid-XU3上编译了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
,看起来像“正确”的地址。
为什么要显示这两个工具的不同地址?
是的,地址是奇怪的,因为它们是Thumb函数,这是一个简单的问题,但是,为什么两个工具向我报告的方式不同是一个好问题。
readelf
故意不使用BFD(与objdump不同),并且主要用于验证其他工具。
在这里:
readelf和objdump之间的区别:这两个程序都能够显示ELF格式文件的内容,那么binutils项目为什么有两个文件转储器?
原因是objdump通过世界的BFD过滤器看到了ELF文件。如果BFD有一个错误,例如,它不同意e_flags中的机器常数,那么很有可能会保持内部一致性。链接器将其视为BFD方式,objdump将其视为BFD方式,GAS将其视为BFD方式。需要一种工具来找出文件的实际含义。
这就是为什么readelf程序不与BFD库链接的原因-它作为独立程序存在,以帮助验证BFD的正常工作。
在某些情况下,readelf可以提供比objdump更多的关于ELF文件的信息。特别是,它可以显示objdump目前无法提供的DWARF调试信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句