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