链接真的这么难吗?两次不一样

发布于 2022-10-15 08:28:52 字数 987 浏览 20 评论 0

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真的是一个问题?
以后要是出现了,还不报错,那怎么办阿??
在线等!!!

  1. [code]/*main.c*/
  2. void swap();
  3. int buf[2] = {1,2};
  4. int main(int argc,char * argv[])
  5. {
  6.     swap();
  7.    return 0;
  8. }

复制代码[/code]

  1. /*swap.c*/
  2. extern int buf[];
  3. int *bufp0 = &buf[0];
  4. int *bufp1;
  5.   void swap()
  6. {
  7.     int temp;
  8.     bufp1 = &buf[1];
  9.    temp = *bufp0;
  10.    *bufp0 = *bufp1;
  11.    *bufp1 = temp;
  12. }

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

七月上 2022-10-22 08:28:52

不懂

娇俏 2022-10-22 08:28:52

where you swap.o

峩卟喜欢 2022-10-22 08:28:52

回复 3# renxiao2003

    同理的产生阿!和main.o一样

天暗了我发光 2022-10-22 08:28:52

本帖最后由 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背着你到底都干了些神马。

青柠芒果 2022-10-22 08:28:52

linker一般指静态链接。loader则是系统装载程序。

对于动态链接库来说处理特别麻烦。动态链接将静态链接中需要处理的符号决议和重定位延迟到了运行时,因此还需要一个专业处理动态链接的动态链接器。

对于一个在linux平台下混了两年以上的程序员来说,这些不是神马新鲜内容了。国内一本《程序员的自我修养》揭露一切秘密 -- 国内不可多得的一本好书啊。另外《linker & loader》、《深入理解计算机系统》都介绍了这方面的内容。查书去吧。

多孤肩上扛 2022-10-22 08:28:52

竟然只是链接了俩o....

初熏 2022-10-22 08:28:52

晕死... 这样也行... 除非编译不依赖libc的代码. 就别想只link 自己写的几个文件汇编产生的obj...

    我当写像操作系统一样的独立代码呢... crt.o这样的东东都是需要的...一大堆的.o文件都链接进去了.

    要是自己来一个个ld...得郁闷死...

     同6楼...推荐程序员自我修养.   的确写的很好... 原因当然是写这个书的人不是叫兽.

我还不会笑 2022-10-22 08:28:52

...第二个能跑就奇怪了

你又不是我 2022-10-22 08:28:52

...第二个能跑就奇怪了
cjaizss 发表于 2011-04-27 10:34

    LZ的链接的时候没有去看它的warning吗?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文