Linux 库总结

来源:互联网 发布:淘宝卖家不说话怎么办 编辑:程序博客网 时间:2024/04/27 14:21
1. 基础知识

1.1. 查看程序调用的库
ldd /bin/ls

1.2. 查看动态库包含的函数:
nm -D /lib64/libc.so.6

1.3. 查看静态库包含的.o文件:
ar -t libgcc.a

1.4. 查看库的位数
file /lib64/libc-2.12.so

1.5. 查看库的soname
readelf -d /lib64/libc.so.6 | grep soname
soname相关知识,可参考[1]

1.6. gcc
-L               # 编译时搜索库的位置
-Wl,-rpath       # 运行时搜索库的位置
-static          # 同时有静态库和动态库时,会先调用动态库,如果要链接静态库,需要加上-static参数
-z nodefaultlib  # 编译选项禁止搜索缺省路径。

2. 编译时库是如何链接的?
gcc -g -Wl,-rpath=/home/lib -o main main.c -L/work/c/lib -lpr
a. 编译时,编译器会根据-L指定的目录,去/work/c/lib下寻找libpr.so文件
b. 读取libpr.so文件中的soname,并记录在可执行文件main中
c. 运行时main根据记录的soname去目录/home/lib中寻找匹配的库文件。
资料来源[2]

3. 运行时库是如何链接的?
3.1. 运行时库的链接顺序
a. 编译目标代码时指定的动态库搜索路径,gcc通过-Wl,rpath参数指定;
b. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
c. 配置文件/etc/ld.so.conf中指定的动态库搜索路径;
d. 默认的动态库搜索路径/lib;
e. 默认的动态库搜索路径/usr/lib。

资料来源[3]

3.2. /etc/ld.so.conf
    /etc/ld.so.conf中的配置对全局用户生效,加入库的链接,可以通过修改/etc/ld.so.conf实现,用root用户运行:
    # echo "/home/lib" >> /etc/ld.so.conf
    # ldconfig  
   运行ldconfig 将 /etc/ld.so.conf 加载到/etc/ld.so.cache中,避免重启系统就可以立即生效。

参考资料:
[1] http://blog.csdn.net/alspwx/article/details/36655645
介绍了库的命名规范和库的版本控制
[2] http://blog.csdn.net/littlewhite1989/article/details/47726011
介绍了编译时库是如何链接的
[3] http://blog.csdn.net/thinkerabc/article/details/628315
介绍了运行时库是如何链接的

0 0
原创粉丝点击