【问题标题】:Difficulty adding $ORIGIN to LDFLAGS难以将 $ORIGIN 添加到 LDFLAGS
【发布时间】:2020-05-27 01:42:33
【问题描述】:

类似于this post,我需要将$ORIGIN/../lib 传递给我的编译过程。我这样做是通过

./configure "LDFLAGS=-Wl,-rpath,\$\$ORIGIN/../lib"
make

但是,当我通过objdump -x src/foo | grep PATH 检查可执行文件时,我得到了

/home/Users/me/foo_repo/lib:/../lib

当我想要的是

/home/Users/me/foo_repo/lib:$ORIGIN/../lib

所以看起来$ORIGIN 正在被评估,而不是仅仅被放入RUNPATH

如何防止这种情况发生?我尝试向 $ 添加转义符,但得到相同的结果。

【问题讨论】:

    标签: makefile compilation linker configure


    【解决方案1】:

    我尝试了很多次,似乎在某些时候它仍然可以解析为空字符串,因为 Makefiles 可以递归运行。我发现可靠的唯一方法是在运行configuremake 的shell 中额外定义export ORIGIN='$ORIGIN',这样即使shell 扩展$ORIGIN,它仍然会产生值$ORIGIN

    另请注意,您还需要 -Wl,-z,origin 以在运行时解释值 $ORIGIN

    【讨论】:

      【解决方案2】:

      它不起作用,因为您还需要第三层引用:因为您通过命令行将此值传递给 configure 脚本,您需要引用 shell 的值。

      你运行这个:

      ./configure "LDFLAGS=-Wl,-rpath,\$\$ORIGIN/../lib"
      

      shell 在调用configure 之前删除了第一级引用,因此放入您的makefile 中的LDFLAGS 的值是这样的:

      LDFLAGS=-Wl,-rpath,$$ORIGIN/../lib
      

      然后当 make 运行链接器时,它会将转义的 $$ 转换为单个 $,然后 make 将调用 shell 并使用选项传递您的链接行:

      -Wl,-rpath,$ORIGIN/../lib
      

      shell 将扩展 $ORIGIN,因为它看起来像一个 shell 变量,将其扩展为空字符串,您会得到结果 -Wl,-rpath,/../lib

      要正确引用,逆向工作通常很有用。当 make 调用您的链接行时,它需要转义 $ORIGIN 以便 shell 不会扩展它,因此您希望参数类似于:

      '-Wl,-rpath,$ORIGIN/../lib'
      

      为了得到它,您需要将您的 LDFLAGS 设置为:

      LDFLAGS='-Wl,-rpath,$$ORIGIN/../lib'
      

      为了实现这一点,您需要在调用 configure 时将其全部从 shell 中转义,包括单引号,例如:

      ./configure "LDFLAGS='-Wl,-rpath,\$\$ORIGIN/../lib'"
      

      (注意,我没试过)

      【讨论】:

      • 这对我不起作用。 ./configure 脚本甚至不会使用外部引号运行。
      • 不知道“甚至不会跑”是什么意思。您至少必须提供一条错误消息。如果它确实无法启动,那么您的命令行中一定有语法错误。
      • gcc: error: '-Wl,-rpath,$$ORIGIN/../lib': No such file or directory 埋在config.log 输出中的某个地方。
      • 好吧,问题在于 LDFLAGS 变量的值可能会被 configure wen 用于测试链接器以及 make,并且它们具有不同的格式。我认为您确实不需要将此选项与./configure 一起使用。如果您在没有此LDFLAGS 设置的情况下运行配置,但在运行时将LDFLAGS 设置传递给make,它是否有效?
      • 它没有,原因与接受的答案中提供的@raspy 相同。
      猜你喜欢
      • 2023-03-08
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多