链接真的这么难吗?两次不一样
1
gcc -O2 -g -o p main.c swap.c
2
cpp main.c main.i
gcc -S main.i -O2 -o main.s
as main.s -o main.o
ld -o execu swap.o main.o
但是第一个能执行,第二个不能!难道linker和loader真的是一个问题?
以后要是出现了,还不报错,那怎么办阿??
在线等!!!
- [code]/*main.c*/
- void swap();
- int buf[2] = {1,2};
- int main(int argc,char * argv[])
- {
- swap();
- return 0;
- }
复制代码[/code]
- /*swap.c*/
- extern int buf[];
- int *bufp0 = &buf[0];
- int *bufp1;
- void swap()
- {
- int temp;
- bufp1 = &buf[1];
- temp = *bufp0;
- *bufp0 = *bufp1;
- *bufp1 = temp;
- }
复制代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
不懂
where you swap.o
回复 3# renxiao2003
同理的产生阿!和main.o一样
本帖最后由 captivated 于 2011-04-26 22:45 编辑
回复 1# sjtlqy
这有神马好等的。
你直接调ld去链接程序,但是实际上程序的真正入口并不是main函数,而是_start -- 它在系统初始化处理/程序结束处理库(crt1.o, crti.o, crtn.o, crtbeginT.o, crtend.o等等)之中。所以你调的ld链接不完全,当然没办法执行。
你可以用gcc --verbose选项看看gcc背着你到底都干了些神马。
linker一般指静态链接。loader则是系统装载程序。
对于动态链接库来说处理特别麻烦。动态链接将静态链接中需要处理的符号决议和重定位延迟到了运行时,因此还需要一个专业处理动态链接的动态链接器。
对于一个在linux平台下混了两年以上的程序员来说,这些不是神马新鲜内容了。国内一本《程序员的自我修养》揭露一切秘密 -- 国内不可多得的一本好书啊。另外《linker & loader》、《深入理解计算机系统》都介绍了这方面的内容。查书去吧。
竟然只是链接了俩o....![](https://www.wenjiangs.com/wp-content/uploads/chinaunix/202207/icon_eek.gif)
晕死... 这样也行... 除非编译不依赖libc的代码. 就别想只link 自己写的几个文件汇编产生的obj...
我当写像操作系统一样的独立代码呢... crt.o这样的东东都是需要的...一大堆的.o文件都链接进去了.
要是自己来一个个ld...得郁闷死...
同6楼...推荐程序员自我修养. 的确写的很好... 原因当然是写这个书的人不是叫兽.
...第二个能跑就奇怪了
LZ的链接的时候没有去看它的warning吗?