unix系统开发-动态链接程序搜索目录

unix系统开发-动态链接程序搜索目录

ID:10677906

大小:22.50 KB

页数:3页

时间:2018-07-07

unix系统开发-动态链接程序搜索目录_第1页
unix系统开发-动态链接程序搜索目录_第2页
unix系统开发-动态链接程序搜索目录_第3页
资源描述:

《unix系统开发-动态链接程序搜索目录》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

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

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

3、yprogmyprog.c-ltest建立可执行文件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_L

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

6、用程序无法运行,但是如果在同动态库链接时使用的是硬编码,那么就无法获得此种灵活性了。硬编码是什么意义呢?这种做法实际上是违反cc命令行用-l指定待链接的库的约定,而直接使用库文件的全路径名进行链接。例如我们可以将myfunc.c作成一个动态链接库:$cc-KPIC-G-o$HOME/myfuncmyfunc.c这里生成的动态库的名称是$HOME/myfunc。由于没有遵循对动态库的命名约定,故我们想链接该库时将不能再使用-l选项的方法。而只好使用如下的“硬编码”:$cc-omyprogmyprog.c$HOME/myfunc使用此种方法,编译链接也

7、能够成功,但如果其后我们将myfunc移至另外某个目录下,则除了重新链接myprog之外别无他法。动态链接的动态特点使得我们可以在不改变函数调用接口的前提下,对共享库的实现进行一定程度的更新,而不用重新对用到的该共享库的程序进行编译、链接。当然在动态链接库被更新之后,需要核实一下使用到该动态库的程序与新版本的兼容性,这个可以使用ldd命令来完成。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。