Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用GNULD将两个或多个可重定位ELF文件合并成一个可重定位ELF文件?_C_Assembly_Ld_Elf - Fatal编程技术网

C 如何使用GNULD将两个或多个可重定位ELF文件合并成一个可重定位ELF文件?

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]

我有两个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]
   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文件调用该函数并返回正确的结果

我的问题是:

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

  • 在c.o中的a.o(.text)和b.o(.text)之间插入了垃圾指令(nopw),以使其16字节对齐(b.o(.text)在c.o中从16字节边界开始)。我是否可以添加一些链接脚本命令,使a.o(.text)和b.o(.text)紧密结合,以便c.o(.text)中的机器代码与从c.asm编译的代码一样,其中c.asm是使用以下命令获得的:

    类别a.asm b.asm>c.asm


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

  • 如果我理解正确,您希望进行增量链接。使用
    -i
    -r
    切换到
    ld
  • 您可以在程序集源中使用
    section.text ALIGN=1
    设置节对齐,也可以在链接器脚本中使用
    SUBALIGN(1)

  • 啊,四眼核发射代码之一……我对链接脚本和ELF格式知之甚少。这只是我学习如何使用链接脚本来控制链接过程的一个练习。非常感谢你,Jester。这只是一个练习,否则这样做没有意义。另一个问题是我可以将ld的输出从可执行类型更改为可重新定位的ELF吗。默认输出类型为可执行ELF。使用
    -r
    创建可重新定位的ELF文件