GNU链接器和体系结构i386
所以我在OS X上运行,我想链接两个Mach-O对象i386。GNU链接器和体系结构i386
首先是从NASM生成(这是一个汇编文件)
nasm -f macho -o kernel.o kernel.asm
二是从GCC
gcc -c -arch i386 screen.c
产生但当我尝试将它们连接...
ld -o myprogram screen.o kernel.o
...我得到这个错误:
Undefined symbols for architecture i386:
"print", referenced from:
start in kernel.o
ld: symbol(s) not found for inferred architecture i386
我不明白为什么,因为我的两个文件分别是Mach-O object i386
:
$ file screen.o
screen.o: Mach-O object i386
$ file kernel.o
kernel.o: Mach-O object i386
如果你需要它,这里的kernel.asm:
[BITS 32]
EXTERN print
GLOBAL start
start:
mov eax, msg
push eax
call print
pop eax
end:
jmp end
msg db 'Hello world!', 10, 0
而这里的screen.c:
void putcar(uchar c)
{
/* Some code here */
}
void print(char *string)
{
while(*string != 0){
putcar(*string);
string++;
}
}
您需要使用符号_print
在你的汇编文件,即
start:
mov eax, msg
push eax
call _print
pop eax
这是因为在编译时的C函数名得到一个前导下划线。
谢谢,它的工作原理!只是一个小问题:我如何将'ld'输出转换为二进制文件? – 2013-03-19 10:13:51
“二元”是什么意思?它已经是二进制可执行文件。你想以可读的格式或二进制的二进制文件? – 2013-03-19 10:18:36
在我需要链接两个文件之前,我只是这样做了:'nasm -f bin -o kernel kernel.asm',我用'x86引导扇区'连接了输出,但现在输出是' Mach-O可执行文件i386'文件... – 2013-03-19 10:28:38
你从来没有好奇过在二进制文件中挖掘过吗? :) – 2013-03-19 10:01:56