a.out/libTest.so静态链接了libme.a, 为什么存在于libme.a中的符号没有在a.out/libTest.so中出现?

博客探讨了在a.out/libTest.so静态链接libme.a时,libme.a中的某些符号未出现在最终可执行文件中的原因。这源于链接器仅选择需要的目标文件,并不全部包含libme.a。这样做可以节省空间和时间。
摘要由CSDN通过智能技术生成

        我们来看这样一个问题:a.out/libTest.so静态链接了libme.a, 为什么存在于libme.a中的符号没有在a.out/libTest.so中出现?  为了方便讨论, 我们只说a.out和libme.a.

        我们知道, 静态库完全等价于目标文件(它们可逆), 当然, 这里很可能是众多目标文件.o . 而可执行文件a.out在链接libme.a时, 首先会对libme.a进行解压, 形成众多的目标文件.o, 然后根据需要来链接需要的文件, 并不是链接所有目标文件, 也没有这个必要。

        下面, 我们来验证一把, 先看看源文件:

taoge@localhost Desktop> cat test1.c
#include <stdio.h>
void fun1()
{
        printf("function1 is called");
}
taoge@localhost Desktop> cat test2.c
#include <stdio.h>
void fun2()
{
        printf("function2 is called");
}
taoge@localhost Desktop> cat main.c 
void fun1();
void fun2();

int main()
{
        fun1();
        return 0;
}
taoge@localhost Desktop> 
         编译并运行一把:

taoge@localhost Desktop> gcc test1.c test2.c -c
taoge@localhost Desktop> ar rcs libme.a test1.o test2.o
taoge@localhost Desktop> gcc main.c -L./ -lme
taoge@localhost Desktop> ./a.out 
function1 is called
         用stings来验证一把:

taoge@localhost Desktop> strings libme.a | grep fun
fun1
fun2
function1 is called
fun1
function2 is called
fun2
taoge@localhost Desktop> strings a.out | grep fun
function1 is called
taoge@localhost Desktop>


        可见, fun2存在与libme.a的符号表中, 但不存在于a.out的符号表中, 上面已经说了原因。  这样做是有好处的, 省空间, 是时间。




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值