如何查看无节头静态链接ELF 64位可执行文件的符号?
如何获取无节头静态ELF文件的符号
你的问题核心是:目标ELF文件为静态链接且无节头表,而nm依赖节头表(如.symtab)读取符号,因此直接调用nm/nm -D无法获取符号。以下是可行的解决方法:
方法1:用objdump结合程序头定位符号表
静态链接的ELF可能仍在程序头的LOAD段中保留符号表,可通过以下步骤提取:
- 先查看程序头信息,定位可能包含符号表的段:
重点关注可读属性的LOAD段,符号表通常存储在这类段中。objdump -p <file-name> - 提取目标段的内容,结合ELF规范解析符号:
符号表结构遵循ELF标准,每个符号项包含名称偏移、值、大小、类型等字段,可对照ELF文档手动解析。objdump -s --start-address=<符号表起始地址> --stop-address=<符号表结束地址> <file-name>
方法2:用readelf强制读取符号表
readelf比nm更底层,可绕过节头表直接指定符号表位置:
- 先通过程序头获取符号表的偏移和大小:
readelf -l <file-name> - 强制将目标段作为符号表读取:
readelf -S --elf-section-offset=<段偏移> --elf-section-size=<段大小> <file-name>
方法3:通过逆向工具恢复符号
如果文件被刻意剥离符号表,只能通过逆向分析恢复:
- 使用GDB手动识别并添加符号:
用gdb <file-name>x/i指令反汇编识别函数入口,再通过add-symbol-file命令手动标注符号。 - 使用IDA Pro、Ghidra等专业逆向工具,它们会自动分析二进制结构,识别函数、字符串、数据区域,支持手动添加符号名称。
注意事项
- 若文件经过
strip命令完全剥离符号,原始符号表已被删除,只能通过逆向分析生成替代符号,无法恢复原始符号名。 - 无节头的ELF通常经过特殊处理(如打包、反逆向保护),需结合二进制分析知识深入处理。
内容的提问来源于stack exchange,提问作者Michaelzh
相关产品推荐
相关产品推荐

