linux下ld连接SO文件时如何制定绝对路径
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下ld连接SO文件时如何制定绝对路径相关的知识,希望对你有一定的参考价值。
我不想使用LD_LIBRARY_PATH来指定SO的搜索路径
参考技术A 连接器使用下面的搜索路径来定位需要的共享库: 1. 所有由"-rpath-link"选项指定的搜索路径. 2. 所有由"-rpath"指定的搜索路径. “-rpath"跟"-rpath_link"的不同之处在于,由"-rpath"指定的路径被包含在可执行文件中,并在运行时使用, 而"-rpath-link"选项仅仅在连接时起作用. 它只用于本地连接器. 3. 在一个ELF系统中, 如果"-rpath"和"rpath-link"选项没有被使用, 会搜索环境变量"LD_RUN_PATH"的内容.它也只对本地连接器起作用. 4. 在SunOS上, “-rpath"选项不使用, 只搜索所有由"-L"指定的目录. 5. 对于一个本地连接器,环境变量"LD_LIBRARY_PATH"的内容被搜索. 6. 对于一个本地ELF连接器,共享库中的`DT_RUNPATH"和`DT_RPATH"操作符会被需要它的共享库搜索. 如果"DT_RUNPATH"存在了, 那"DT_RPATH"就会被忽略. 7. 缺省目录, 常规的,如"/lib"和"/usr/lib". 8. 对于ELF系统上的本地连接器, 如果文件"/etc/ld.so.conf"存在, 这个文件中有的目录会被搜索.如上所述,可以用"-rpath-link","-rpath",或者文件"/etc/ld.so.conf"来指定。
动态链接--so的搜索过程
可执行文件所依赖的so路径保存在.dynamic 里面,由DT_NEED类型表示。如下:
如果DT_NEED里面保存的是绝对路径,那ld就在绝对路径下查找so。
如果DT_NEED里面保存的是相对路径(上面的msgsnd都是相对路径),那ld是通过以下过程来查找的:
1.查找由LD_LIBRARY_PATH指定的路径
2.在/lib,/usr/lib和/etc/ld.so.conf中指定的路径下查找
在/lib,/usr/lib一般是系统本身所需要的库,在/usr/local/lib/是非系统所需的第三方库的so
所以我们一般在install oss,如果configure没有指定路径默认是放到/usr/local/lib下。
如果我们自己编译的so,一定要放到LD_LIBRARY_PATH中,或者放到/etc/ld.so.conf中,不然在运行链接这些so的可执行文件时会报错,找不到so.
以上是关于linux下ld连接SO文件时如何制定绝对路径的主要内容,如果未能解决你的问题,请参考以下文章