C 如何使用GNULD将两个或多个可重定位ELF文件合并成一个可重定位ELF文件?
我有两个x86程序集源文件a.asm和b.asm(用NASM语法编写) a、 asm和b.asm组合在一起是函数myfun(inta,intb)的一个实现,该函数返回a+1+b。但我把代码放在不同的文件里C 如何使用GNULD将两个或多个可重定位ELF文件合并成一个可重定位ELF文件?,c,assembly,ld,elf,C,Assembly,Ld,Elf,我有两个x86程序集源文件a.asm和b.asm(用NASM语法编写) a、 asm和b.asm组合在一起是函数myfun(inta,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]
; 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-felf32编译a.asm和b.asm,并得到a.o和b.o。
之后,我使用下面的链接脚本将a.o和b.o结合起来,以获得c.o
SECTIONS {
.text : {
a.o (.text)
b.o (.text)
}
}
可以从C文件调用该函数并返回正确的结果
我的问题是:
虽然我不确定重点是什么,但以下是你的答案:
-i
或-r
切换到ld
section.text ALIGN=1
设置节对齐,也可以在链接器脚本中使用SUBALIGN(1)
啊,四眼核发射代码之一……我对链接脚本和ELF格式知之甚少。这只是我学习如何使用链接脚本来控制链接过程的一个练习。非常感谢你,Jester。这只是一个练习,否则这样做没有意义。另一个问题是我可以将ld的输出从可执行类型更改为可重新定位的ELF吗。默认输出类型为可执行ELF。使用
-r
创建可重新定位的ELF文件