共享库是一种将库函数打包成一个单元使之能够在运行时被多个进程共享的技术。
为了使用一个共享库就需要做两件事:
- 由于可执行文件不再包含她所需的目标文件的副本,因此它需要通过某种机制找出在运行时所需要的共享库。这是通过在链接阶段将共享库的名称嵌入可执行文件中来完成的。一个程序所依赖的所有共享库列表被称为程序的动态依赖列表。
- 在运行时必须存在某种机制来解析嵌入的库名——即找出与在可执行文件中指定的名称对应的共享库文件——接着如果库不在内存中的话就将库加载进入内存。
有三种通知动态链接器共享库的位置的方式:
方式一:使用LD_LIBRARY_PATH环境变量:
事例:
LD_LIBRARY_PATH = . ./prog
方式二:将共享库安装到其中一个标准库目录中(/lib、/usr/lib或者在/etc/ld.so.conf中列出的其中一个目录)
方式三:在静态编辑阶段可以在可执行文件中插入一个在运行时搜索共享库的目录列表。这种方式对于库位于一个固定的但不属于动态链接器搜索的标准位置的位置中时非常有用。要实现这种方式需要在创建可执行文件时使用-rpath链接器选项。例如:
$ gcc -g -Wall -Wl,-rpath,/home/mkt/pdir -o prog prog.c libdemo.so
上面的命令将字符串/home/,kt/pdir复制到了可执行文件prog的运行时库路径(rpath)列表中,因此当运行这个程序时,动态链接器在解析共享库引用时还会搜索这个目录。