neodreamerus 发表于 2014-05-25 23:12

合并两个relocatable ELF文件的问题


汇编写的a.s编译成a.o
b.s编译成b.o
要将a.o和b.o合并成一个c.o
要求c.o中代码部分和 cat a.s b.s > c.s,
再编译c.s得到的代码是一样的(b.s中的指令紧接着a.s最后一条指令执行)

link script应该怎么写啊?

neodreamerus 发表于 2014-05-25 23:29

再说的清楚一点。
a.s的内容

myfunc:
    instr1
    instr2
    instr3
    instr4

b.s的内容

instr5
instr6
instr7
instr8
leave
ret

让a.o和b.o合并称c.o后里面的myfunc可以被调用, 调用后执行instr,leave,ret共10条指令
myfunc:
instr1
instr2
instr3
instr4
instr5
instr6
instr7
instr8
leave
ret

看了GNU ld的手册,link script大概意思明白,动手写的时候又不会写了。

amarant 发表于 2014-05-26 09:08

为什么一个函数要写在两个文件里面呢。
把这个两个代码段指定到同一个段里,应该可以实现你的目的。需要在.s里面指定一下段

neodreamerus 发表于 2014-05-26 09:38

是的。
我只是想学学link script。我说的问题不是一个实际的问题。只是为了练习和理解link script用的

neodreamerus 发表于 2014-05-26 09:38

是的。
我只是想学学link script。我说的问题不是一个实际的问题。只是为了练习和理解link script用的

amarant 发表于 2014-05-26 09:46

那你自己多尝试几次吧

neodreamerus 发表于 2014-05-26 15:41


自己试了试,我用了如下的链接脚本
SECTION {
   .text = {
   a.o (.text)
   b.o (.text)
   }
}
得到的elf文件中的myfunc可以在C中调用了。

但是有两个问题:
1. 生成的ELF文件时executable的,不过里面的myfunc还是可以调用。
2. 在a.s的代码后插入了一些junk代码(nopw),好像和对齐有关。
   不知道怎么去除。

neodreamerus 发表于 2014-05-27 09:33

自己回答自己吧,link的时候指定SUBALIGN就行
页: [1]
查看完整版本: 合并两个relocatable ELF文件的问题