一、库文件是怎么加载进入内存的?
linux下的库有两种:静态库和共享库(动态库)。
二者的不同点在于代码被载入的时刻不同。 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
一般静态库的后缀是.a,它由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表,然后用ar命令将很多.o转换成.a形成。而动态库的后缀为.so,由gcc加特定参数编译产生。
二、程序编译时如何找到这些库文件,并加载进来?
编译器将先后搜索:
1) elf文件的DT_RPATH段(在编译时指定目录);
2) 环境变量LD_LIBRARY_PATH中指定的路径;
3) /etc/ld.so.cache文件列表;
4) /lib/,/usr/lib目录;
如果找不到则会链接失败。因此,如果出现找不到库的情况,可以:
1)在编译时-rpath指定目录;
2)修改.bash_profile文件在LD_LIBRARY_PATH中加入指定目录;
3)修改/etc/ld.so.conf加入指定目录,然后调用ldconfig重新生成/etc/ld.so.cache;
4)将动态库放入/lib/,/usr/lib两个默认路径;