2013-03-19 63 views
0

所以我在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++; 
     } 
} 
+0

你从来没有好奇过在二进制文件中挖掘过吗? :) – 2013-03-19 10:01:56

回答

3

您需要使用符号_print在你的汇编文件,即

start: 
    mov eax, msg 
    push eax 
    call _print 
    pop eax 

这是因为在编译时的C函数名得到一个前导下划线。

+0

谢谢,它的工作原理!只是一个小问题:我如何将'ld'输出转换为二进制文件? – 2013-03-19 10:13:51

+0

“二元”是什么意思?它已经是二进制可执行文件。你想以可读的格式或二进制的二进制文件? – 2013-03-19 10:18:36

+0

在我需要链接两个文件之前,我只是这样做了:'nasm -f bin -o kernel kernel.asm',我用'x86引导扇区'连接了输出,但现在输出是' Mach-O可执行文件i386'文件... – 2013-03-19 10:28:38

相关问题