首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >链接共享库的绝对路径与相对路径

链接共享库的绝对路径与相对路径
EN

Stack Overflow用户
提问于 2018-05-28 05:01:44
回答 1查看 8.6K关注 0票数 5

我一直在尝试将一个共享库链接到我的程序中,我希望它的路径相对于我的RPATH。

但是,当我运行ldd时,我注意到共享库的绝对路径是链接的。你知道为什么吗?

编辑:

代码语言:javascript
复制
/home/projects/my_files/winter_fresh.so
libgcc_s.so.1 => /home/tomo/anaconda3/lib/libgcc_s.so.1 (0x00007f0a3bf64000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0a3bd47000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0a3b97d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0a3e369000)
libstdc++.so.6 => /home/tomo/anaconda3/lib/libstdc++.so.6 (0x00007f0a3b643000)

问题是第一个文件。我不希望winter_fresh的库是一个绝对路径,因为我有一个包含它的RPATH。

EN

回答 1

Stack Overflow用户

发布于 2018-05-28 06:44:00

我的猜测是,您使用winter_fresh.so作为源文件来编译您的程序,而不是通过链接它。

如果您将共享库/可执行文件的路径编码为/home/projects/my_files/winter_fresh.so,则可以将共享库放在RPATH目录中,如下所示:

代码语言:javascript
复制
 $ mkdir some_dir
 $ mkdir -p some_dir/home/projects/my_files
 $ cp /home/projects/my_files/winter_fresh.so some_dir/home/projects/my_files
 $ RPATH=$(pwd)/some_dir ./executable

链接器在RPATH下搜索名为/home/projects/my_files/winter_fresh.so的库。

现在来做一个简单的测试:

代码语言:javascript
复制
// main.c
int main() {
  int external_function(void);
  return external_function();
}

// exlib.c
#include <stdio.h>
int external_function(void) {
  return printf("%s\n", __func__);
}

现在,让我们创建使用exlib.so共享库作为源代码编译的bad.out

代码语言:javascript
复制
$ gcc -shared -fPIC -o exlib.so exlib.c
$ gcc /tmp/exlib.so main.c -o bad.out
$ ldd bad.out
linux-vdso.so.1 (0x00007ffd921db000)
/tmp/exlib.so (0x00007fe4470f7000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fe446d3b000)
/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fe4474fb000)

如您所见,字符串/tmp/exlib.so指向共享库。我可以运行该程序,使用RPATH将链接器指向exlib.so位置。我需要在RPATH中创建子树/tmp/exlib.so,如下所示:

代码语言:javascript
复制
$ mkdir -p lib/tmp
$ mv exlib.so lib/tmp
$ RPATH=$(pwd)/lib ./bad.out
external_function

运行bad.out时,链接器在RPATH中搜索名为/tmp/exlib.so的文件。

Linux使用一种命名shared libraries的约定。现在让我们针对good.out进行链接:

代码语言:javascript
复制
$ gcc -shared -fPIC -o libexlib.so exlib.c
$ gcc -I /tmp -lexlib main.c -o good.out
$ ldd good.out 
linux-vdso.so.1 (0x00007ffcb01bf000)
libexlib.so => not found
libc.so.6 => /usr/lib/libc.so.6 (0x00007fc1230ef000)
/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fc1236ad000)

现在您可以看到,good.outlibexlib.so链接在一起。链接时,gcc在/tmp目录中搜索名为libexlib.so的库。我可以通过指定LD_LIBRARY_PATH到libexlib.so所在的路径来运行good.out:

代码语言:javascript
复制
 $ LD_LIBRARY_PATH=/tmp ldd ./good.out
 external_function
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50556472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档