如何使用GNU ld将两个或多个可重定位的ELF文件组合成一个可重定位的ELF文件?

时间:2014-05-26 22:32:18

标签: c assembly ld elf

我有两个x86汇编源文件a.asm和b.asm(用NASM语法编写)。

a.asm和b.asm combined是函数myfun(int a,int b)的一个实现,返回一个+ 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文件调用该函数并返回正确的结果。

我的问题是:

  1. file c.o显示c.o是可执行的,带有程序头,但c.o中的函数myfun可以在链接时使用。如何使c.o成为一个没有程序头的纯可重定位文件?

  2. 在co中的ao(.text)和bo(.text)之间插入了垃圾指令(nopw),使其16字节对齐(bo(.text)在co的16字节边界处启动)。我可以添加一些链接脚本命令来使ao(.text)和bo(.text)紧凑组合,因此co(.text)中的机器代码就像从c.asm编译的代码,其中c.asm是使用命令获得的:

    cat a.asm b.asm> c.asm

1 个答案:

答案 0 :(得分:2)

虽然我不确定重点是什么,但这是你的答案:

  1. 如果我理解正确,您希望进行增量链接。使用-i-r切换到ld
  2. 您可以使用SECTION .text ALIGN=1在汇编源中设置节对齐,也可以使用SUBALIGN(1)
  3. 在链接描述文件中设置节对齐