【问题标题】:How to combine two or more relocatable ELF files into one relocatable ELF file using GNU ld?如何使用 GNU ld 将两个或多个可重定位 ELF 文件组合成一个可重定位 ELF 文件?
【发布时间】: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 文件中调用并返回正确的结果。

我的问题是:

  1. 文件 c.o 表明 c.o 是带有程序头的可执行文件,尽管 c.o 中的函数 myfun 可以在链接时使用。如何让c.o成为没有程序头的纯可重定位文件?

  2. 在 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格式知之甚少。这只是我学习如何使用链接脚本来控制链接过程的练习。

标签: c assembly ld elf


【解决方案1】:

虽然我不确定重点是什么,但以下是您的答案:

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

【讨论】:

  • 非常感谢你,小丑。这只是一个练习,否则这样做没有意义。
  • 另一个问题是我可以将 ld 的输出从可执行类型更改为可重定位的 ELF。默认输出类型是可执行的 ELF。
  • 使用-r创建可重定位的elf文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2014-08-30
  • 2014-12-21
  • 2020-08-07
  • 1970-01-01
  • 2018-10-25
相关资源
最近更新 更多