免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2750 | 回复: 7
打印 上一主题 下一主题

发现一个奇怪的gcc连接现象 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-03 10:02 |只看该作者 |倒序浏览
1.c

  1. #include <stdio.h>

  2. char *s="hello world!\n";

  3. void f()
  4. {
  5. printf(s);
  6. }
复制代码


2.c

  1. #include <stdio.h>

  2. char *t="abc\n";

  3. void g()
  4. {
  5. printf(t);
  6. }
复制代码


3.c

  1. void f();

  2. int main()
  3. {
  4. f();
  5. }
复制代码


gcc -c 1.c -o 1.o
gcc -c 2.c -o 2.o
gcc -c 3.c -o 3.o

gcc 1.o 2.o 3.o -o 11
objdump -dj .text 11//11包含g,虽然没有用到

ar rv test.a 1.o 2.o
gcc 3.o test.a -o 22//不能gcc test.a 3.o -o 22,报错,f未定义
objdump -dj .text 22//22不包含g

4.c

  1. #include <stdio.h>

  2. char *s="hello world!";

  3. void f()
  4. {
  5. printf(s);
  6. }

  7. char *t="abc";

  8. void g()
  9. {
  10. printf(t);
  11. }

  12. void *u="12345";
复制代码


gcc -c 4.c -o 4.o

ar rv test.a 4.o //不报错
gcc 3.o test.a -o 33
./33//会发现连接1.o中的f

ar rv test2.a 4.o
gcc 3.o test2.a -o 44
objdump -dj .text 44//发现f,g都在44中
objdump -sj .rodata 44/发现s,t,u也都在44中

因此似乎可以得出以下结论
1.gcc命令行中的所有目标文件都会被放入可执行文件,即使没有用到
2.gcc的命令行中文件是有顺序的,库文件要在后面
3.gcc连接是以目标文件为单位的,如果使用了目标文件中的函数和变
量,该目标文件将全部被连接到可执行文件中
4.ar库文件只区分目标文件名,而不管其中的名称是否冲突
5.gcc在ar库中顺序查找需要解析的名称在哪个目标文件中,找到就连
接该目标文件

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2008-12-03 11:07 |只看该作者
我把你的程序改一改,你再试试.
1.c

  1. #include <stdio.h>

  2. char *s="hello world!\n";
  3. extern char *s1;/*新加的*/
  4. void f()
  5. {
  6. printf(s);
  7. printf(s1);/*新加的*/
  8. }
复制代码


2.c

  1. #include <stdio.h>

  2. char *t="abc\n";
  3. char *s1="s1\n";/*新加的*/
  4. void g()
  5. {
  6. printf(t);
  7. }
复制代码


3.c

  1. void f();

  2. int main()
  3. {
  4. f();
  5. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2008-12-03 11:14 |只看该作者
你想测试什么? 是不是某条结论有问题?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2008-12-03 11:17 |只看该作者
你可以看看,两个的现象应该是不一样的

论坛徽章:
0
5 [报告]
发表于 2008-12-03 11:19 |只看该作者
>>两个的现象应该是不一样的

还是不明白你的意思,什么现象?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2008-12-03 11:21 |只看该作者
你的结论没什么问题

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2008-12-03 11:21 |只看该作者
链接以目标文件为单位,所以链接库的时候发现g也在里面.

论坛徽章:
0
8 [报告]
发表于 2008-12-03 11:58 |只看该作者
gnu toolchain还不完善,贡献代码是有难度的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP