免费注册 查看新帖 |

Chinaunix

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

用静态库链接program时具体链接多少内容? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-06 07:57 |只看该作者 |倒序浏览
program调用static library中的一个function foo()
但static library的.a文件包括f1.o, f2.o, f3.o,其中f2.o包括了foo()和bar()

在链接program时,.a文件里面的哪些代码被放进了输出可执行文件中了?
是foo(),还是f2.o,还是.a全部?

论坛徽章:
0
2 [报告]
发表于 2008-09-06 11:37 |只看该作者
foo()............................

论坛徽章:
0
3 [报告]
发表于 2008-09-06 13:59 |只看该作者
这个取决于编译器。首先肯定不是.a全部连接的,这个可以肯定。对于GCC一般是以.o为单位的,即你使用了foo(),那么所在.o会全部被连接进目标程序中。VC6.0则是基于函数连接的,即只连接所使用函数的目标代码,所以在VC6.0中可以很方便地自己“重载”库函数,而GCC就会导致冲突。

这个实际上自己做一些程序很容易测试出来的,用编译器加上objdump静态分析一下就很清楚了。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2008-09-06 14:28 |只看该作者
一般来说链接的时候是以.o为单位的;

  1. linux-0gt0:/tmp/test.tmp/1 # cat >1.c
  2. int func1(){return 1;}
  3. int func2(){return 2;}
  4. linux-0gt0:/tmp/test.tmp/1 # cat >2.c
  5. int func3(){return 3;}
  6. int func4(){return 4;}
  7. linux-0gt0:/tmp/test.tmp/1 # cat >3.c
  8. int func1();
  9. main()
  10. {
  11.         func1();
  12. }
  13. linux-0gt0:/tmp/test.tmp/1 # cat >Makefile
  14. SRC_LIB=1.c 2.c
  15. SRC=3.c
  16. all:a.out
  17. a.out:3.o lib1.a
  18.         gcc 3.c -L. -l1
  19. lib1.a:1.o 2.o
  20.         ar rcs $@ $^
  21. linux-0gt0:/tmp/test.tmp/1 # make
  22. cc    -c -o 3.o 3.c
  23. cc    -c -o 1.o 1.c
  24. cc    -c -o 2.o 2.c
  25. ar rcs lib1.a 1.o 2.o
  26. gcc 3.c -L. -l1
  27. linux-0gt0:/tmp/test.tmp/1 # nm a.out | grep func
  28. 080483a4 T func1
  29. 080483ae T func2
复制代码

[ 本帖最后由 cjaizss 于 2008-9-6 14:57 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP