我有两个x86程序集源文件a.asm和b.asm(用NASM语法编写)。
asm和b.asm的组合是函数myfun(int a,intb)的一个实现,它返回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字节对齐(c.o中的b.o(.text)从16字节边界开始)。我可以添加一些链接脚本命令,使a.o(.text)和b.o(.text)紧凑地组合在一起,使c.o(.text)中的机器代码与从c.asm编译的代码一样,在c.asm中使用命令获得c.asm:
a类装配b类装配>c类装配
最佳答案
虽然我不确定重点是什么,但你的答案如下:
如果我理解正确,您需要进行增量链接。使用-i
或-r
切换到ld
。
您可以使用SECTION .text ALIGN=1
在程序集源中设置节对齐方式,也可以使用SUBALIGN(1)
在链接器脚本中设置节对齐方式
关于c - 如何使用GNU ld将两个或多个可重定位的ELF文件组合为一个可重定位的ELF文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23878506/