我正在构建一个裸机可执行文件,其中包含一些特殊的代码段。然而,当我执行 objdump -d
命令时,我只能得到 .text
和 .init.text
段的代码。根据 objdump
的 man 手册,该命令只会反汇编那些被期望包含指令的段,使用 -d
选项时。那么这些段是哪些,objdump
如何判断哪些段需要进行反汇编?我知道也可以使用 -D
选项对所有段进行完整的反汇编,但这通常远远超出了我的需求。
我正在构建一个裸机可执行文件,其中包含一些特殊的代码段。然而,当我执行 objdump -d
命令时,我只能得到 .text
和 .init.text
段的代码。根据 objdump
的 man 手册,该命令只会反汇编那些被期望包含指令的段,使用 -d
选项时。那么这些段是哪些,objdump
如何判断哪些段需要进行反汇编?我知道也可以使用 -D
选项对所有段进行完整的反汇编,但这通常远远超出了我的需求。
objdump
内部使用libbfd
获取节(section)信息。 objdump
通过回调函数传递给bfd_map_over_sections()
,该函数在每个节上调用回调函数。当被调用时,libbfd
将asection *
传递给回调函数,其中具有成员变量type
。如果类型包含SEC_CONTENTS | SEC_CODE
标志,则在传递-d
选项时,objdump
会对其进行反汇编。
深入了解libbfd
相对困难,我预计类型检测取决于体系结构,但我希望至少提供了正确的指针。(也许我有更多时间后,会深入挖掘并扩展答案)。
顺便说一句,如果您需要从objdump -D
中过滤出感兴趣的节(section),可以使用sed
脚本,如下所示:
# ------------Place section names here ---------------vvv
objdump -D object.o | sed -rn '/Disassembly of.*\.(comment|text)/{:a;p;n;/Disassembly of/!ba}'