Linux函数库操作相关

1.连接函数库时搜索路径

搜索路径顺序:LD_LIBRARY_PATH --> /etc/ld.so.conf --> /lib,/usr/lib

命令:

ldconfig:为/etc/ld.so.conf文件中包含的路径和默认路径/lib,/usr/lib下的函数库创建soname库,并把soname库及其指向信息写入文件/etc/ld.so.cache。

ldconfig 路径名:为指定路径下的函数库创建soname库,并把soname库及其指向信息写入文件/etc/ld.so.cache。

ldconfig -n 路径名:为指定路径下的函数库创建soname库,但不放入ld.so.cache文件。

文件:

/etc/ld.so.conf:存放ldconfig运行时搜索的路径。

/etc/ld.so.cache:存放ldconfig搜索到的库和soname。

2.用gcc编译连接

gcc有预处理,编译,汇编,连接等阶段,可以在任一个阶段停下。可生成对象文件,函数库,可执行文件等。

gcc -Wall -g -c file.c:为c语言源文件生成对象文件file.o,不连接。

ar demo_static.so file1.o file2.o:生成静态函数库。

gcc -fPIC -Wall -g -c file.c:为c语言原文件生成可用于共享函数库的对象文件file.o,不连接。

gcc -shared -Wl,-soname,library.so.n -g -o library.so.n.m file.o -lc:用libc.so库,file.o生成共享函数库library.so.n.m及其soname库library.so.n。

gcc -g -o demo_dynamic demo_dynamic.c -ldl:用libdl.so库,demo_dynamic.c成可执行文件demo_dynamic,用到库libdl.so表示可执行文件运行期间动态调用函数库的代码可执行。即demo_dynamic.c中如果有用到dlopen(),dlsym(),dlerror(),dlclose()等动态调用函数库函数可行。

3.查看ELF文件依赖的库

ldd不要对不信任的ELF文件用,因为它隐含了对某些环境变量的改变。

ldd demo_use:查看可执行文件demo_use依赖的库。

ldd libhello.so:查看库libhello.so依赖的库。

4.查看ELF文件的符号信息,

查找某个符号(变量或函数)在哪个库里

nm demo_use:查看可执行文件demo_use所有符号信息。

nm libhello.so:查看库libhello.so所有符号信息。

nm -o /lib/* /usr/lib/* 2> /dev/null | grep "function":在目录/lib,/usr/lib下查找包含了function的文件。

nm -o ./*.so* | grep 'hello':在当前目录的*.so*文件中查找包含了hello的文件。

5.系统的函数库

ld-linux.so:载入ELF文件用。可执行文件启动,启动时载入共享函数库都要用到这个库。

libc.so:c语言支持库。

libdl.so:动态连接库用。

6.环境变量

调试用

LD_LIBRARY_PATH:启动时连接共享函数库,执行时打开动态函数库首先搜索的路径。

LD_DEBUG:显示运行时的信息,如符号寻找和绑定,重定向,执行等等。