前言:
当前朋友们对“动态链接库与静态链接库的优缺点”都比较讲究,姐妹们都需要学习一些“动态链接库与静态链接库的优缺点”的相关资讯。那么小编在网上收集了一些有关“动态链接库与静态链接库的优缺点””的相关知识,希望同学们能喜欢,兄弟们一起来了解一下吧!文章开始前给读者的建议:先了解下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: