龙空技术网

动态库链接静态库,95%的程序员踩过的坑.新手必看

我不是你的狗 143

前言:

当前朋友们对“动态链接库与静态链接库的优缺点”都比较讲究,姐妹们都需要学习一些“动态链接库与静态链接库的优缺点”的相关资讯。那么小编在网上收集了一些有关“动态链接库与静态链接库的优缺点””的相关知识,希望同学们能喜欢,兄弟们一起来了解一下吧!

文章开始前给读者的建议:先了解下plt表、got表、重定向、延迟加载等概念。

废话不多说,我们的场景是:有一个静态库liba_static_old.a 、动态库libb_share.so会链接liba_static_old静态库。然后可执行文件链接动态库libb_share.so。

先看源代码:

a_static_old.c源码

#include <stdio.h>

#include "a_static_old.h"

void printer(void){

printf("print info from a_static_old\n");

}

b_share.c源码

#include "b_share.h"

#include <stdio.h>

#include "a_static_old.h"

void printer_b(void){

printf("b_share call printer of a\n");

printer();

}

main.c源码

#include "b_share.h"

#include <stdio.h>

#include "a_static_old.h"

void printer(void){

printf("print info from main\n");

}

int main(){

printer_b();

}

我们期望的结果是:运行main后,输出“b_share call printer of a“及“print info from a_static_old“

实际运行结果如下:

我们看到动态库调用的printer函数居然是main函数里面的。怎么一回事呢?我们反汇编一下libb_share.so。

那么,有没有办法让libb_share.so在链接的时候不走符号表呢?我们可以使用-BSymbolic链接选项。如下:

我们再反汇编一下libb_share.so:

标签: #动态链接库与静态链接库的优缺点 #动态链接库与静态链接库的优缺点区别