【发布时间】:2014-07-15 17:19:48
【问题描述】:
我有两个 x86 汇编源文件 a.asm 和 b.asm(用 NASM 语法编写)。
a.asm 和 b.asm 组合是函数 myfun(int a, int b) 的实现,它返回 a+1+b。但是我把代码放到了单独的文件中。
; a.asm
global myfun
myfun:
push ebp
mov ebp,esp
mov eax, [ebp+8]
inc eax
第二个文件 b.asm 包含 myfun 的其余指令
; b.asm
add eax, [ebp+12]
pop ebp
ret
然后我用nasm -f elf32编译a.asm和b.asm,得到a.o和b.o。 之后,我使用以下链接脚本将 a.o 和 b.o 组合起来以获取 c.o
SECTIONS {
.text : {
a.o (.text)
b.o (.text)
}
}
该函数可以从 C 文件中调用并返回正确的结果。
我的问题是:
文件 c.o 表明 c.o 是带有程序头的可执行文件,尽管 c.o 中的函数 myfun 可以在链接时使用。如何让c.o成为没有程序头的纯可重定位文件?
-
在 c.o 中的 a.o (.text) 和 b.o (.text) 之间插入了垃圾指令 (nopw),使其 16 字节对齐(b.o (.text) 在 c.o 中的 16 字节边界处开始)。我可以添加一些链接脚本命令以使 ao (.text) 和 bo (.text) 紧凑地组合在一起,因此 co (.text) 中的机器代码就像从 c.asm 编译的代码一样,其中 c.asm 是使用命令获得的:
cat a.asm b.asm > c.asm
【问题讨论】:
-
啊,这些四眼核发射代码之一......
-
我对链接脚本和ELF格式知之甚少。这只是我学习如何使用链接脚本来控制链接过程的练习。