0

私は 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++;
        }
}
4

1 に答える 1

3

_printasm ファイルでシンボルを使用する必要があります。

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

これは、コンパイル時に C 関数名の先頭にアンダースコアが付けられるためです。

于 2013-03-19T10:00:53.850 に答える