我有两个源文件(一个用NASM程序集编写 - try.asm
,另一个用纯C编写 - tryasmc.c
)。我在.c文件中有一个C函数func()
,我必须链接到汇编文件中的extern func
。
try.asm
文件:
section .text
extern func
global main
main:
push ebp
mov ebp, esp
call func
pop ebp
ret
tryasmc.c
文件:
void func()
{
// doesn't really do anything
}
链接描述文件(mylink.ld):
ENTRY(main)
OUTPUT_FORMAT(binary)
SECTIONS
{
.text :
{
tryasm.o (.text)
tryasmc.o (.text)
}
}
我想单独编译它们并链接它们(通过链接描述文件)以生成flat binary
文件。我做了以下事情:
nasm -f elf32 -o tryasm.o try.asm
(编译汇编代码)gcc -c -g -m32 -o tryasmc.o tryasmc.c
(编译C代码)gcc -m32 tryasm.o tryasmc.o -o tryasm -T mylink.ld
我收到以下错误:
/usr/lib32/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0x18): undefined reference to `__init_array_end'
/usr/lib32/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0x23): undefined reference to `__init_array_start'
/usr/lib32/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0x47): undefined reference to `__init_array_start'
/usr/bin/ld: tryasm: hidden symbol `__init_array_end' isn't defined
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
正如我之前所说,我希望生成平面二进制文件tryasm
,其中包含main
作为入口点,func
作为子例程。 我该如何解决?为什么我会收到这些错误?
注意:我正在使用64 bit Linux (ubuntu-16)
计算机,但使用elf format
和gcc
将代码编译为32位nasm
。
目的:我在汇编中编写了一个小操作系统,所以我需要flat binary
加载到RAM中。