【问题标题】:Setting shared libraries prefix when compiling编译时设置共享库前缀
【发布时间】:2017-09-19 16:44:12
【问题描述】:

我正在尝试编译一个程序,我需要在共享库路径上设置一个前缀路径,我尝试使用-Wl,-rpath -Wl,-dynamic-linker,而我从ldd 得到的是:

linux-vdso.so.1 =>  (0x00007fff75336000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f19d55b8000)
/pathtolib/lib64/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x000055d3d67e1000)

但我期望得到的是:

linux-vdso.so.1 =>  (0x00007fff75336000)
libc.so.6 => /pathtolib/lib/x86_64-linux-gnu/libc.so.6 (0x00007f19d55b8000)
/pathtolib/lib64/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x000055d3d67e1000)

我真的需要设置这个并强制程序对所有共享库使用非默认路径 (/pathtolib)。

这是我用来编译的命令:

gcc list/list.c -o bin/list -Wl,-rpath,/pathtolib -Wl,--dynamic-linker,/pathtolib/lib64/ld-linux-x86-64.so.2

我做错了什么?! :|

【问题讨论】:

  • 查看这个名为 patchelf 的实用程序。它用于更改 ELF 二进制文件的动态链接器和 RPATH。

标签: c gcc makefile ld


【解决方案1】:

-rpath 选项没有为搜索路径中的各个目录指定前缀;相反,它指定了一个以冒号分隔的路径列表。动态链接器首先搜索这些目录,但如果需要,它会继续搜索路径的其余部分。因此,如果您希望动态链接器将libc.so.6 解析为/pathtolib/lib/x86_64-linux-gnu/libc.so.6,那么您必须在rpath 中指定不是/pathtolib 而是/pathtolib/lib/x86_64-linux-gnu

我不知道链接选项或 ELF 标头字段会指示动态链接器执行您似乎要求的操作:通过为每个元素添加前缀来修改标准库搜索路径。如果您想做类似的事情,那么您可能需要提供自己的动态链接器。

或者,也许您想构建和使用 chroot 环境而不是弄乱 rpath。这需要更多的工作来设置,但它的效果是允许您使用一组完全不同的库。

【讨论】:

  • 谢谢,我知道 chroot,但我真正想做的是用不同的目录结构构建自己的发行版,这就是我需要前缀的原因。我想将所有:/etc,/lib,/lib64,...移动到:/linux/etc,/linux/lib,/linux/lib64,...这就是我需要前缀的原因,我认为这就是rpath 可以。现在我没有得到答案,我该怎么办?
  • @MerajSahebdar,据我所知,没有 完全符合您的描述。要使用您喜欢的布局构建您自己的发行版,您需要从头开始构建所有内容。 Chroot 不是您想要的最终产品,但它可能是从这里到那里的一大块。你可以考虑阅读Linux from Scratch。即使您不完全遵循他们的食谱,它也包含许多您可能会发现有用的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多