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:显示运行时的信息,如符号寻找和绑定,重定向,执行等等。