我有两个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/

10-14 05:30