如何用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
相关产品推荐
相关产品推荐

