编译时设置共享库前缀

Setting shared libraries prefix when compiling

我正在尝试编译一个程序,我需要在共享库路径上设置一个前缀路径,我尝试使用 -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

我做错了什么?!! :|

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

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

或者,也许您想构建和使用 chroot 环境而不是弄乱 rpaths。这需要相当多的工作来设置,但它的效果是允许您使用一整套不同的库。