链接选项-rpath的一个问题记录

问题简述

大概是这么一个情况,有一个过去已经写好的程序,这个程序用于处理网络通信,接收一些操作指令。具体的指令操作通过运行时加载动态库的形式进行扩展。(类似于net-snmp二次开发的一种形式)
问题是这样的,用于扩展功能的动态库,其本身又链接了一系列的动态库,这些库的位置与这个扩展用的动态库存放的位置是相对的。大概如下

                程序 program
                            |
                            |    运行时加载(dlopen/LoadLibrary等)
                        sodir/lib1.so
                            |    相对路径存放
                        sodir/lib2/lib2.so

问题在于编译lib1.so的时候,并不知道将来lib1.so会存放于相对程序program的工作路径的什么位置,导致不知道lib2.so的位置在哪里。
如果链接的时候直接使用-rpath=./lib2的话,这就需要lib2.so在程序工作路径下的lib2目录下方可,因为运行时加载路径并不是相对于lib1.so而是相对于program的。

解决办法

当前没有好的解决办法。
一个简单的方法是写一个libwarp来包装一下lib1,在libwarp中先设置以下LD_LIBRARY_PATH环境变量,加上自身所在的路径(dladdr/GetModulePath获取),然后再使用ldopen的方式加载lib1。而程序则按照原来加载lib1.so的方式加载libwarp.so即可。

这个问题大概可以用下面的代码来表示(就不详细叙述了)
https://files.cnblogs.com/files/oloroso/sopath.tar.gz

猜你喜欢

转载自www.cnblogs.com/oloroso/p/8931926.html