2013-03-19 83 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

相關問題