首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU与体系结构i386

GNU与体系结构i386
EN

Stack Overflow用户
提问于 2013-03-19 09:57:52
回答 1查看 607关注 0票数 0

,所以我在OS 上运行,我想链接两个Mach-O对象i386。

第一个是从NASM生成的(它是一个程序集文件)

代码语言:javascript
复制
nasm -f macho -o kernel.o kernel.asm

第二个是GCC的作品。

代码语言:javascript
复制
gcc -c -arch i386 screen.c

但当我试图把它们联系起来..。

代码语言:javascript
复制
ld -o myprogram screen.o kernel.o

...I得到了以下错误:

代码语言:javascript
复制
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

代码语言:javascript
复制
$ file screen.o
screen.o: Mach-O object i386
$ file kernel.o
kernel.o: Mach-O object i386

如果您需要,这里是kernel.asm

代码语言:javascript
复制
[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

代码语言:javascript
复制
void putcar(uchar c)
{
    /* Some code here */
}

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-19 10:00:53

您需要在asm文件中使用符号_print,即

代码语言:javascript
复制
start:
    mov  eax, msg
    push eax
    call _print
    pop  eax

这是因为C函数名在编译时会得到一个前导下划线。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15496268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档