私は OS Xで実行していて、2 つの Mach-O オブジェクト i386 をリンクしたいと考えています。
1 つ目は NASM から生成されます (アセンブリ ファイルです)。
nasm -f macho -o kernel.o kernel.asm
2番目は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
私の2つのファイルは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++;
}
}