使用dlopen在自定义库位置加载依赖库

3

我的程序使用来自某个供应商的'libone.so'对象。它在系统中具有自定义位置。程序搜索该库的位置,然后使用dlopen打开它。当'libone.so'在底层执行某些操作并开始加载'libsecond.so'时,出现了一个问题。我通过strace看到,dlopen尝试按照ldconfig定义的标准路径查找'libsecond.so',而没有将'libone.so'的位置作为可能路径之一。

是否可以在'libone.so'内部配置dlopen调用,以使其从'libone.so'的位置加载'libsecond.so'?('libsecond.so'位于与'libone.so'相同的路径上)

附注:在程序启动之前,我无法影响系统配置(ldconf路径)。我需要在我的程序中解决这个问题。

附注二:如果我将'libone.so'的路径添加到/etc/ld.so.conf.d/custom.conf中,则问题得到解决。


1
libsecond.so是自动加载的还是libeone.so像你一样做了一些魔法呢? - Max Langhof
你能设置/修改执行环境吗?LD_LIBRARY_PATH 环境变量可以解决这个问题。 - JL. Sanchez
@MaxLanghof libsecond.so会被libone.so自动加载。如果两个库都位于标准路径(例如/usr/lib)中,则没有问题。我的情况是这些库的位置是自定义的,我先加载第一个库,第二个库应该由第一个库加载。 - dojo_user
@JL.Sanchez 我尝试在我的程序中使用stdlib.h中的'setenv'调用来设置LD_LIBRARY_PATH,就在第一个库的"dlopen"之前,但是这并没有帮助。我无法提前设置LD_LIBRARY_PATH,也无法像这样启动我的程序:LD_LIBRARY_PATH=my_path ./my_program。 - dojo_user
1个回答

1
我认为你有三个选项:
  1. 创建一个脚本文件(例如bash,Python等),在执行二进制程序之前设置LD_LIBRARY_PATH并使其可执行。

  2. 使用-rpath链接器选项,添加一个固定的绝对路径到搜索路径中,动态链接器将使用它们来查找库文件,除了LD_LIBRARY_PATH

  3. dlopen从下至上使用绝对路径。即首先dlopen依赖项,然后dlopen主库。

我更喜欢第一种选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接