Linux下如何将obj文件转为可编辑asm并重新汇编为obj?
可行方案:把OBJ文件转成可重汇编的ASM代码
当然可以实现,不过objdump默认输出确实有一堆as不认的注释和漏段问题,得用对参数或者换工具,下面是实操步骤:
一、用objdump生成干净的可汇编代码
直接用带参数的objdump输出,再过滤掉无用内容:
objdump -d -M intel --no-show-raw-insn your_file.o | grep -v "^Disassembly" | grep -v "^$" > clean.s
参数说明:
-d:反汇编可执行段-M intel:输出Intel语法(习惯AT&T的话去掉就行,as默认支持AT&T)--no-show-raw-insn:不输出机器码(as根本不需要这个)- 后面的grep是过滤掉objdump自动加的段描述、空行和注释,剩下的就是纯汇编指令
要是需要反汇编.data/.bss这类非代码段,加段参数并改用-D(反汇编所有指定段):
objdump -D -M intel --no-show-raw-insn --section=.text --section=.data --section=.bss your_file.o | grep -v "^Disassembly" | grep -v "^$" > clean_full.s
二、更省心的工具组合:objcopy + 手动段声明
如果嫌objdump过滤麻烦,直接提取二进制段再用ASM的.incbin指令导入:
- 提取各段的原始二进制:
objcopy -O binary --only-section=.text your_file.o text.bin objcopy -O binary --only-section=.data your_file.o data.bin
- 写一个简单的ASM模板导入这些二进制:
.section .text .global main # 保留原符号声明,链接要用 .incbin "text.bin" .section .data .incbin "data.bin"
保存成import.s,这种方式生成的ASM完全是as能直接识别的,修改时直接在.incbin前后加指令就行。
三、修改ASM的注意点
- 必须保留段声明(
.section .text这类)和全局符号(.global xxx),不然as不知道把代码放哪,链接也会报错 - 用Intel语法的话,一定要在ASM开头加
.intel_syntax noprefix,不然as默认用AT&T语法会把指令认成错误 - 别乱改原有的符号名,比如原OBJ里的
main,改了链接时找不到
四、汇编回OBJ文件
改完ASM后直接用as编译:
# AT&T语法直接编译 as -o modified.o modified.s # Intel语法要加参数 as -o modified.o --intel-syntax modified.s
内容的提问来源于stack exchange,提问作者Emanuele
相关产品推荐
相关产品推荐

