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

如何用GNU汇编器(GAS)从手写.s文件生成原生64位ELF文件

解决方法:直接生成纯二进制文件,跳过链接环节

因为你要完全复用自己手写的ELF头和程序头,绝对不能让ld介入链接流程——ld的本职工作就是生成/整合ELF结构,只要用它链接,就会覆盖或添加自带的头信息。正确的做法是让GAS直接输出包含所有手写内容的二进制文件,无需链接器干预。

步骤1:用GAS汇编成目标文件

使用as命令指定64位架构,输出包含所有手写字节的目标文件:

as --64 -o your_program.o your_program.s

注意:不要在汇编代码中添加.section这类伪指令,否则GAS会将内容拆分到不同段,后续提取时可能丢失手写的头信息,直接用.byte/.quad等指令定义所有字节即可。

步骤2:提取纯二进制内容

用objcopy把目标文件中的所有字节导出为纯二进制文件,确保完整保留你手写的ELF头、程序头和代码段:

objcopy -O binary your_program.o your_program.raw

步骤3:设置可执行权限并验证

此时your_program.raw已经包含符合ELF64规范的完整结构,只需设置可执行权限即可运行:

chmod +x your_program.raw
./your_program.raw
echo $?  # 应输出预期的退出码42

关键注意事项

  • 手写的ELF64头必须严格遵循规范:e_ident魔数必须是0x7f 0x45 0x4c 0x46,e_machine设为0x3e(对应x86_64架构),e_entry要指向代码的起始虚拟地址,程序头的p_offset/p_vaddr/p_filesz等字段必须与实际字节偏移完全匹配。
  • 若尝试用ld输出二进制(如ld -m elf_x86_64 --oformat binary ...),链接器仍可能修改段结构,破坏手写的头信息,因此不推荐。

内容的提问来源于stack exchange,提问作者pikafan_8080

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:23:24