同时链接不同版本静态库的问题分析

在一个项目中,模块A链接了 poco 的1.6.1版本静态库。

解析json抛异常,但是独立的 demo 中却正常。

排查发现,项目中的其他模块集成了poco 1.5的版本静态库。

通过poco的文档发现,json在1.5的版本中确实存在bug,而在1.6的版本中修复了此bug。

问题就是:明明是静态链接,为什么还会互相影响?并且实际链接的是哪个版本?

于是写了个demo模拟调用不同版本静态库的同一个函数的情况。

test.h

extern int add(int, int);

test1.c

int add(int a, int b)
{
    return a+b;
}

test2.c

int add(int a, int b)
{
    return a*b;
}

main.c

#include 
#include "test.h"

int main()
{
    int sum = add(2,5);
    printf("sum = %d\n", sum);    
    return 0;
}

模拟2个不同版本的静态库。版本1里面实现加法,版本2的 同一个符号名实现为乘法。

// 静态库1
gcc -o test1.o -c test1.c  // test1.o
ar -v -q libtest1.a tst1.o // libtest1.a

// 静态库2
gcc -o test2.o -c test2.c  // test2.o
ar -v -q libtest2.a tst2.o // libtest2.a

// 把不同版本的静态库都链接进去,只是链接顺序不同
gcc -o main1 main.c -L. -ltest1 -ltest2
gcc -o main2 main.c -L. -ltest2 -ltest2

// 观察输出结果
./main1
    输出 sum=7

./main2
    输出 sum=10

上述测试说明了问题:

不同版本的静态库中,同一个函数,如果符号名,参数都没有改变的情况下,内存中是只保留一份先加载的那份代码。

ps:其实打印一下函数地址会更直观,不过demo写完就不想改了,能说明问题就行了

 

你可能感兴趣的:(同时链接不同版本静态库的问题分析)