,所以我在OS 上运行,我想链接两个Mach-O对象i386。
第一个是从NASM生成的(它是一个程序集文件)
nasm -f macho -o kernel.o kernel.asm第二个是GCC的作品。
gcc -c -arch i386 screen.c但当我试图把它们联系起来..。
ld -o myprogram screen.o kernel.o...I得到了以下错误:
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下面是屏幕.c:
void putcar(uchar c)
{
/* Some code here */
}
void print(char *string)
{
while(*string != 0){
putcar(*string);
string++;
}
}发布于 2013-03-19 10:00:53
您需要在asm文件中使用符号_print,即
start:
mov eax, msg
push eax
call _print
pop eax这是因为C函数名在编译时会得到一个前导下划线。
https://stackoverflow.com/questions/15496268
复制相似问题