我有两个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文件调用该函数并返回正确的结果。
我的问题是:
file c.o显示c.o是可执行的,带有程序头,但c.o中的函数myfun可以在链接时使用。如何使c.o成为一个没有程序头的纯可重定位文件?
在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
答案 0 :(得分:2)
虽然我不确定重点是什么,但这是你的答案:
-i
或-r
切换到ld
。SECTION .text ALIGN=1
在汇编源中设置节对齐,也可以使用SUBALIGN(1)