链接c和汇编

链接c和汇编,第1张

概述我有一个非常简单的main.c文件: #include <stdio.h>int cnt;extern void increment();int main(){ cnt = 0; increment(); printf("%d\n", cnt); return 0;} 甚至更简单的hello.asm: EXTERN cntsection .text g 我有一个非常简单的main.c文件:

#include <stdio.h>int cnt;extern voID increment();int main(){    cnt = 0;    increment();    printf("%d\n",cnt);    return 0;}

甚至更简单的hello.asm:

EXTERN cntsection .text global increment increment:  inc DWord [cnt]ret

首先,我输入gcc -c main.c来获得main.o
然后我得到hello.o – nasm -f macho hello.asm -DDARWIN
最后,为了得到一个可执行文件,我做了ld -o main main.o hello.o -arch i386 -lc并得到一个错误:

ld: warning: -macosx_version_min not specifIEd,assuming 10.10ld: warning: ignoring file main.o,file was built for unsupported file format  (   0xCF 0xFA 0xED 0xFE 0x07 0x00 0x00 0x01 0x03 0x00 0x00 0x00 0x01 0x00 0x00 0x00 ) which is not the architecture being linked (i386): main.oUndefined symbols for architecture i386:  "_main",referenced from: implicit entry/start for main executable"cnt",referenced from:  increment in hello.old: symbol(s) not found for architecture i386

如何修复此链接错误?

解决方法 >指定体系结构(32/64位,选项m32或m64)
>链接crt文件,这些文件包含运行时 – 这是调用主函数的代码

修改你的asm文件:

EXTERN _cntsection .textglobal _increment_increment:  inc DWord [_cnt]ret

所以最后的命令行应该是:

gcc -c -m32 main.cnasm -f macho hello.asm -DDARWINld hello.o main.o /usr/lib/crt1.o  -lc -o main

检查拱门并执行:

file mainmain: Mach-O executable i386./main1
总结

以上是内存溢出为你收集整理的链接c和汇编全部内容,希望文章能够帮你解决链接c和汇编所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1227627.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存