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

时间:2022-07-28 19:32:17

        我们来看这样一个问题: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的符号表中, 上面已经说了原因。  这样做是有好处的, 省空间, 是时间。