You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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指令导入:

  1. 提取各段的原始二进制:
objcopy -O binary --only-section=.text your_file.o text.bin
objcopy -O binary --only-section=.data your_file.o data.bin
  1. 写一个简单的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:53:17