在Linux系统开发中,我们频繁的使用动态库(又称共享库),它相较于静态库而言有节省空间、便于更新等优点。但同时,动态库也有其缺点,加载速度相较于静态库而言较慢。那么,为什么调用动态库内的函数要比调用静态库内函数速度慢呢?它的加载过程具体又是怎样的呢?我们可借助gdb调试工具和反汇编工具objdump来找寻原因。
首先准备简单的动态库测试函数:

准备测试程序:

借助gcc工具生成动态库,链接动态库,编译生成可执行文件,并帮助动态链接器指定动态库加载位置。
- gcc -c -fPIC add.c sub.c mul.c
- gcc -shared -o libmymath.so add.o sub.o mul.o
- gcc main.c -o app -L ./ -l mymath -I ./
- export LD_LIBRARY_PATH=./
接下来,我们来研究下,在 main.c 中调用共享库的函数 add是如何实现的。首先反汇编看一下动态库libmymath.so,方便后期数据比对。(由于数据较多,这里只保留了与后期分析相关联的部分,同时为了方便观察地址,我们以32位系统为例。)
$ objdump libmymath.so -dS...00000538 <add>: 538: 55 push %ebp 539: 89 e5 mov %esp,%ebp 53b: 8b 45 0c &nbs