【问题标题】:correct usage of rpath (relative vs absolute)rpath 的正确使用(相对与绝对)
【发布时间】:2016-06-27 15:38:02
【问题描述】:

在构建二进制文件或库时,指定rpath,即

-Wl,rpath,<path/to/lib>

告诉链接器在二进制文件运行时在哪里找到所需的库。

关于绝对路径和相对路径的 UNIX 哲学是什么?使用绝对路径是否更好,以便可以从任何地方找到 lib?还是将其设为相对更好,这样复制整个目录或重命名更高级别的路径不会导致二进制文件不可用?

更新

使用$ORIGIN 通常是构建二进制文件的首选方式。对于库,我喜欢放在绝对路径中,否则您将无法链接到该库。符号链接会将$ORIGIN 更改为指向链接 的路径,而不是链接目标 的路径。

【问题讨论】:

    标签: gcc linker rpath


    【解决方案1】:

    rpath 的情况下,使用相对路径没有意义,因为相对路径将相对于当前工作目录,而不是相对于找到二进制/库的目录。所以它根本不适用于$PATH 中的可执行文件或几乎任何情况下的库。

    相反,您可以使用$ORIGIN“特殊”路径来获得相对于可执行文件的路径
    -Wl,-rpath,'$ORIGIN' -- 请注意,您需要在其周围加上引号以避免外壳将其解释为变量,如果您尝试在 Makefile 中执行此操作,则需要 $$ 以避免 make 也解释 $

    【讨论】:

    • 不应该是-rpath='$ORIGIN'吗? (等号而不是逗号)
    • @SpyrosManiatopoulos:您通常希望将两个参数传递给链接器(-rpath 和实际路径参数),因此它们之间的逗号。 GNU ld 将按照您的建议将其作为两个参数或带有 = 的单个参数接受,因此任何一个都可以工作。其他链接器(想到 Solaris)只接受它作为两个参数。
    【解决方案2】:

    关于绝对路径和相对路径的 UNIX 哲学是什么?

    使用相对路径使可执行文件在从特定目录调用时起作用,这几乎从不你想要的。例如。如果可执行文件在/app/foo/bin/exe 中并且有DT_RUNPATHlib/,并且依赖库在/app/foo/lib/libfoo.so 中,那么exe 只会在从/app/foo 调用时运行,而不是在从任何其他调用时运行目录。

    使用绝对路径要好得多:您可以执行cd /tmp; /app/foo/bin/exe 并让可执行文件仍然有效。然而,这仍然不够理想:您不能轻易拥有多个版本的二进制文件(在开发过程中很重要),并且您需要指示最终用户必须在哪里安装软件包。

    在支持$ORIGIN 的系统上,使用$ORIGIN/../libDT_RUNPATH 将为您提供一个可执行文件,该可执行文件在安装在任何位置并从任何目录调用时都可以使用,只要保留bin/lib/ 的相对路径.

    【讨论】:

      猜你喜欢
      • 2017-04-01
      • 2011-01-01
      • 2015-04-08
      • 1970-01-01
      • 2012-03-13
      相关资源
      最近更新 更多