UNIX系统开发-动态链接程序搜索目录.doc

上传人:scccc 文档编号:13941601 上传时间:2022-01-27 格式:DOC 页数:2 大小:36KB
返回 下载 相关 举报
UNIX系统开发-动态链接程序搜索目录.doc_第1页
第1页 / 共2页
UNIX系统开发-动态链接程序搜索目录.doc_第2页
第2页 / 共2页
亲,该文档总共2页,全部预览完了,如果喜欢就下载吧!
资源描述

《UNIX系统开发-动态链接程序搜索目录.doc》由会员分享,可在线阅读,更多相关《UNIX系统开发-动态链接程序搜索目录.doc(2页珍藏版)》请在三一文库上搜索。

1、UNIX 系统开发动态链接程序搜索目录 在采用动态链接方式对程序进行编译,链接时候。链接程序只是在最终的可执行文件中记录下关于所引用的共享库中的符号的一些登记信息, 以便在程序被执行时, 动态链接程序能够 根据这些登记信息找到相应的代码。 因此登记动态链接方式而言, 除了在链接阶段涉及到对 库文件的搜索路径外,还有一个在程序运行阶段对库文件的搜索问题。前一个问题我们知道借助于 LD_LIBRARY_PA TH 环境变量及 cc 命令行中的 -L 选项已经得 到了比较好的解决。 对于第二个问题, 我们必须提供一种机制, 使得动态链接程序能够找到 相应的动态库,然后才能将其代码映射到其自己的地址空

2、间中。UNIX 系统中对这些问题的解决实际上采取了类似的方法。 程序员可以使用 LD_RUN_PATH 来解决上面的第二个问题。 同 PATH 变量相同, LD_RUN_PA TH 的值也是一系列由冒号分隔 的绝对路径名组成的。 在此环境变量中, 我们可以列出所用到的动态库所在的那些目录, 一 般动态链接程序在程序运行时对这些目录进行搜索。例如,我们可以定义 LD_RUN_PATH 的值如下:$ LD_RUN_PATH=$HOME/lib;export LD_RUN_PATH 这里我们在 LD_RUN_PATH 中只指定了一个目录名。在使用如下命令:$ cc -L $HOME/lib -o m

3、yprog myprog.c -l test建立可执行文件 myprog 之后,在 shell 提示符下输入:$ myprog .在执行此程序时,动态链接程序将根据 LD_RUN_PATH 中所记录的路径( $HOME/lib), 在其 中依次搜索有关的动态库 libtest.so。在搜索完 LD_RUN_PATH 指定的各个目录之后,动态链接程序将根据缺省设置搜索系统标 准位置。对于动态链接程序而言,库的标准位置只有 /usr/lib 。编译系统所提供的库的每一个 可执行版本都保留在 /usr/lib 目录中。上一节我们介绍过的环境变量 LD_LIBRARY_PATH 实际上也能起到同样的作

4、用。并且使用 此环境变量还有一个好处就是在链接生成了可执行文件之后, 可以把此可执行文件用到的共 享库移至另一个目录中,不必重新对程序进行链接。只需恰当地设置 LD_LIBRARY_PATH 的值,仍然可以让动态链接程序找到相应的动态库。仍以上例来说明这个问题。假定在生成了 myprog 文件之后,我们将 libtest.so 移至另外一个 目录 $HOME/sharedlib 下。此时仅仅将 LD_RUN_PATH 的值设成是 $HOME/sharedlib 是不行 的,因为编译产生的可执行程序将无法使用$HOME/sharedlib目录下的libtest.so。但可以在LD_LIBRARY

5、_PATH 中指定新的目录。$LD_LIBRARY_PATH= $HOME/sharedlib;export LD_LIBRARY_PA TH这样再执行 myprog时,动态链接程序将首先在 $HOME/lib中搜索libtest.so。当然此时它是 找不到 该文件 的。 于是根据 LD_LIBRARY_PATH 的值 , 动 态 链接 程 序 将搜 索 $HOME/sharedlib 目录,这时它将找到所需要的库。此种方法能够奏效是因为 libtest.so 的路径名在 myprog 中不是硬编码, 所以可以在执行程序 时引导动态链接程序搜索另外一个目录。 也就是说, 可以移动共享库而不致使

6、引用程序无法 运行,但是如果在同动态库链接时使用的是硬编码,那么就无法获得此种灵活性了。 硬编码是什么意义呢?这种做法实际上是违反 cc 命令行用 -l 指定待链接的库的约定,而直 接使用库文件的全路径名进行链接。例如我们可以将 myfunc.c 作成一个动态链接库: $ cc -K PIC -G -o $HOME/myfunc myfunc.c 这里生成的动态库的名称是 $HOME/myfunc 。由于没有遵循对动态库的命名约定,故我们想 链接该库时将不能再使用 -l 选项的方法。而只好使用如下的“硬编码” :$ cc -o myprog myprog.c $ HOME/myfunc使用此种方法,编译链接也能够成功,但如果其后我们将 myfunc 移至另外某个目录下,则 除了重新链接 myprog 之外别无他法。 动态链接的动态特点使得我们可以在不改变函数调用接口的前提下, 对共享库的实现进行一 定程度的更新, 而不用重新对用到的该共享库的程序进行编译、 链接。 当然在动态链接库被 更新之后, 需要核实一下使用到该动态库的程序与新版本的兼容性,这个可以使用 ldd 命令 来完成。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1