我正在尝试编译程序,我需要在共享库路径上设置前缀路径,我尝试使用-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
选项未为搜索路径中的各个目录指定前缀;而是指定用冒号分隔的路径列表。动态链接器首先搜索这些目录,但如果需要,它会继续搜索的其余部分。因此,如果希望动态链接程序将libc.so.6
解析为/pathtolib/lib/x86_64-linux-gnu/libc.so.6
,则必须在/pathtolib
中指定不是/pathtolib/lib/x86_64-linux-gnu
而是rpath
。
我不知道链接选项或ELF标头字段会指示动态链接程序执行您似乎要执行的操作:通过为每个元素添加前缀来修改标准库搜索路径。如果您想做类似的事情,那么您可能需要提供自己的动态链接器。
另外,也许您想构建和使用chroot环境,而不是弄乱rpaths。这需要大量的工作来设置,但是这样做的效果是允许您使用一组完全不同的库。