2013-03-19 3 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 때문에 : 여기

[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 

: 그리고 당신이 그것을 필요로하는 경우에

$ file screen.o 
screen.o: Mach-O object i386 
$ file kernel.o 
kernel.o: Mach-O object i386 

, 여기 kernel.asm입니다 screen.c :

,451,515,
void putcar(uchar c) 
{ 
    /* Some code here */ 
} 

void print(char *string) 
{ 
     while(*string != 0){ 
       putcar(*string); 
       string++; 
     } 
} 
+0

전에 바이너리 파일을 파고 들지 않았습니까? :) –

답변

3

당신은, 당신은 ASM 파일의 기호 _print를 사용할 필요가 즉

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

컴파일 할 때 C의 함수 이름은 밑줄을 얻을 수 있기 때문입니다.

+0

감사합니다. 작동합니다! 약간의 질문 : 'ld'출력을 어떻게 바이너리로 변환 할 수 있습니까? –

+0

"바이너리"란 무엇을 의미합니까? 이미 이진 실행 파일입니다. 바이너리를 사람이 읽을 수있는 형식으로 저장 하시겠습니까? –

+0

필자는 두 파일을 링크해야하기 전에'nasm -f bin -o kernel kernel.asm'과'x86 부트 섹터 '를 사용하여 출력물을 묶어 버렸습니다. 출력물은' Mach-O executable i386' file ... –

관련 문제