强制solib依赖项在使用gcc的目录下具有非标准命名共享库的相对路径

强制solib依赖项在使用gcc的目录下具有非标准命名共享库的相对路径,gcc,linker,relative-path,absolute-path,ldd,Gcc,Linker,Relative Path,Absolute Path,Ldd,我有一个关于共享库与几个目录下的非标准命名约定的链接的问题。我需要生成的可执行文件在可执行文件当前位置内搜索共享库,但找不到命令行参数来强制执行此行为 要演示此行为,所需的只是目录下的共享库 gcc -shared mylib.c -o some/dir/mylib.so gcc main.c -o main -Lsome/dir -l:mylib.so 可执行main提供以下ldd输出: ldd main some/dir/mylib.so (0xf76e2000) 我需要的输

我有一个关于共享库与几个目录下的非标准命名约定的链接的问题。我需要生成的可执行文件在可执行文件当前位置内搜索共享库,但找不到命令行参数来强制执行此行为

要演示此行为,所需的只是目录下的共享库

gcc -shared mylib.c -o some/dir/mylib.so

gcc main.c -o main -Lsome/dir -l:mylib.so
可执行main提供以下ldd输出:

ldd main
     some/dir/mylib.so (0xf76e2000)
我需要的输出是:

ldd main
     mylib.so => some/dir/mylib.so (0xf7700000)
如果库按惯例命名为libmylib.so而不是mylib.so,则可以创建此输出:

这也会根据需要在ldd列表中删除路径some/dir

我已经调查了ld和gcc的rpath和命令行选项的使用情况,但没有找到满意的解决方案。在这种情况下,对非标准名称和目录结构的严格要求无法轻易更改

我的问题是如何强制库的依赖关系相对于当前目录,而不是绝对依赖关系,如通过gcc命令行选项的第二个ldd

谢谢你抽出时间,我希望我已经合理地解释了这个问题


Jon.

有一个神奇的变量可以传递给rpath来实现这一点:
$ORIGIN
。有关详细信息,请参见
man-ld.so

我认为在您的情况下,命令应该如下所示(未测试):

请注意,不能让shell作为shell变量展开
$ORIGIN


顺便说一句,这是谷歌第一次点击“rpath relative”。

有一个神奇的变量可以传递给rpath来实现这一点:
$ORIGIN
。有关详细信息,请参见
man-ld.so

我认为在您的情况下,命令应该如下所示(未测试):

请注意,不能让shell作为shell变量展开
$ORIGIN

顺便说一句,这是谷歌第一次点击“rpath-relative”。

尝试添加到您的共享库中:

$ gcc -shared mylib.c -o some/dir/mylib.so -Wl,-soname=mylib.so
$ gcc main.c -o main -Lsome/dir -l:mylib.so
$ LD_LIBRARY_PATH=some/dir:$LD_LIBRARY_PATH ldd main
        mylib.so => some/dir/mylib.so (0x00007fa7a4fd6000)
尝试在共享库中添加:

$ gcc -shared mylib.c -o some/dir/mylib.so -Wl,-soname=mylib.so
$ gcc main.c -o main -Lsome/dir -l:mylib.so
$ LD_LIBRARY_PATH=some/dir:$LD_LIBRARY_PATH ldd main
        mylib.so => some/dir/mylib.so (0x00007fa7a4fd6000)

感谢您的回复,我很感激您的回复。但是,您指定的命令只有在库按惯例命名为'libmylib.so',而我的名为'mylib.so',在这种情况下,我必须使用'-l:mylib.so'。这会破坏ldd创建的相对路径,并强制使用绝对路径。对,我错过了冒号。
$ORIGIN
在您的情况下不起作用吗?您好,ams,当使用绝对库名(即mylib.so)时,它似乎没有任何作用。Jon.谢谢,我很感谢您的回复,但是,只有当库的名称按惯例命名为'libmylib.so',而我的名为'mylib.so',在这种情况下,我必须使用'-l:mylib.so',您指定的命令才会起作用。这会破坏ldd创建的相对路径,并强制使用绝对路径。对,我错过了冒号。
$ORIGIN
在您的情况下不起作用吗?您好,ams,当使用绝对库名(即mylib.so)时,它似乎没有任何作用。乔恩。
$ gcc -shared mylib.c -o some/dir/mylib.so -Wl,-soname=mylib.so
$ gcc main.c -o main -Lsome/dir -l:mylib.so
$ LD_LIBRARY_PATH=some/dir:$LD_LIBRARY_PATH ldd main
        mylib.so => some/dir/mylib.so (0x00007fa7a4fd6000)