编译时设置共享库前缀

时间:2017-09-19 16:44:13

标签: c gcc makefile ld

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

我做错了什么?!! :|

1 个答案:

答案 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。这需要相当多的工作来设置,但它会让你使用一整套不同的库。