我知道没有简单的方法。
曾经我需要创建一个普通的二进制文件,该文件将被另一个程序加载和执行。但是,as 不允许我这样做。我尝试使用gobjcopy 将目标文件转换为原始二进制文件,但无法正确转换如下代码:
.quad LinkName2 - LinkName1
在gobjcopy 生成的二进制文件中看起来像
.quad 0
我最终编写了特殊的转储程序,该程序是可执行的,可以节省磁盘上的部分内存:
.set SYS_EXIT, 0x2000001
.set SYS_READ, 0x2000003
.set SYS_WRITE, 0x2000004
.set SYS_OPEN, 0x2000005
.set SYS_CLOSE, 0x2000006
.data
转储文件:.ascii "./dump"
.byte 0
输出文件描述符:.quad 0
.section __TEXT,__text,regular
.globl _main
_main:
movl $0644, %edx # file mode
movl $0x601, %esi # O_CREAT | O_TRUNC | O_WRONLY
leaq dumpfile(%rip), %rdi
movl $SYS_OPEN, %eax
syscall
movq %rax, OutputFileDescriptor(%rip)
movq $EndDump - BeginDump, %rdx
leaq BeginDump(%rip), %rsi
movq OutputFileDescriptor(%rip), %rdi
movl $SYS_WRITE, %eax
syscall
movq OutputFileDescriptor(%rip), %rdi
movl $SYS_CLOSE, %eax
syscall
完成:
movq %rax, %rdi
movl $SYS_EXIT, %eax
系统调用
.align 3
开始转储:
.include “dump.s”
结束转储:
.quad 0
必须保存为原始二进制文件的代码包含在
dump.s中