用静态库链接program时具体链接多少内容?

发布于 2022-09-21 01:45:15 字数 186 浏览 16 评论 0

program调用static library中的一个function foo()
但static library的.a文件包括f1.o, f2.o, f3.o,其中f2.o包括了foo()和bar()

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

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

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

发布评论

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

评论(3

一瞬间的火花 2022-09-28 01:45:15

foo()............................

请别遗忘我 2022-09-28 01:45:15

这个取决于编译器。首先肯定不是.a全部连接的,这个可以肯定。对于GCC一般是以.o为单位的,即你使用了foo(),那么所在.o会全部被连接进目标程序中。VC6.0则是基于函数连接的,即只连接所使用函数的目标代码,所以在VC6.0中可以很方便地自己“重载”库函数,而GCC就会导致冲突。

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

浪漫之都 2022-09-28 01:45:15

一般来说链接的时候是以.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 编辑 ]

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