【问题标题】:Escaping $ORIGIN for libtool based project为基于 libtool 的项目转义 $ORIGIN
【发布时间】:2016-05-05 21:40:18
【问题描述】:

对于不使用 libtool 的项目,我已成功将 RUNPATH 设置为 LDFLAGS="-Wl,-rpath='\$$ORIGIN/../lib64',--enable-new-dtags"。但是,对于基于 libtool 的项目,我得到 RIGIN/../lib。是否可以使用与/不兼容 libtool 的单个 export?还是我必须检测是否正在使用 libtool?

bash-4.3# readelf -d ../tmp/bin/grep

Dynamic section at offset 0x43028 contains 18 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libc.so]
 0x000000000000001d (RUNPATH)            Library runpath: [$ORIGIN/../lib]
 ...
bash-4.3# readelf -d ../tmp/bin/awk

Dynamic section at offset 0x9b028 contains 18 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libc.so]
 0x000000000000001d (RUNPATH)            Library runpath: [RIGIN/../lib]
 ...

编辑: 更正,我用的是-Wl,-rpath="'\$$ORIGIN'"/../lib,--enable-new-dtags

【问题讨论】:

  • [RIGIN/../lib] 看起来像是某种吹爆的 make 变量。如果有人在 makefile 中执行此操作,我会期望这种效果:ORIGIN = whatever,然后执行$ORIGIN 而不是$(ORIGIN),或者没有正确转义$ORIGIN,我猜这就是您所看到的.您可能需要额外的逃生级别,但我认为您必须进行实验。 \$\$ORIGIN 会通用吗?试试 libtool 看看它是否有效,这样你就有了一个起点。
  • \$\$ORIGIN 使RUNPATHs [RIGIN/../lib].
  • 我看到有人提到使用 gcc 规范文件。我对这些不熟悉。 libtool 会使用它吗?
  • 我熟悉的唯一规范文件是用于 rpm [或其他包] 管理器的。你知道 libtool 输出中的最后一行 make 用于 ld 吗?另外,我会查看它以了解它对 LDFLAGS 的作用。也许你需要另辟蹊径,为 libtool 做\$ORIGIN 看看。你想要的是适用于 libtool 的配方 [你已经有了非版本]。然后,在最坏的情况下,它是一个条件挂钩。 libtool 可能想要拥有 LDFLAGS,因此您可能必须设置另一个变量,例如:EXTRA_LDFLAGS 或类似的,它将使用,但不要受到干扰。我认为你只需要继续修改它。
  • 如果你选择info gcc,然后搜索spec file,它会给你一些信息。但是,我不确定它有什么帮助。猜测一下,它更多是用于控制由 gcc 调用的 cpp、ld 等,而不是像 libtool 这样调用 gcc 的东西

标签: linux gcc linker libtool


【解决方案1】:

在尝试为 autotools 配置脚本设置 LDFLAGS 时,我遇到了同样的问题。像这样设置它对我有用:

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

在构建过程中,它转换为 libtool 参数,如下所示:

/bin/sh ../../libtool  --tag=CC   --mode=link gcc  -Wall -I/usr/include/openssl ...<skip>... -lrt  -Wl,-rpath,'$ORIGIN/../lib' -Wl,-rpath,'$ORIGIN/../usr/lib' -o libcrypto_backend.la  libcrypto_backend_la-crypto_cipher_kernel.lo libcrypto_backend_la-crypto_storage.lo libcrypto_backend_la-pbkdf_check.lo libcrypto_backend_la-crc32.lo  libcrypto_backend_la-crypto_openssl.lo

因为我不得不从另一个包装器 makefile 中调用 ./configure 脚本,所以它看起来更有趣:

LDFLAGS="$(OS_LDFLAGS) -Wl,-rpath,'\$$\$$ORIGIN/../lib' -Wl,-rpath,'\$$\$$ORIGIN/../usr/lib'" ./configure ...<skip>

【讨论】:

    猜你喜欢
    • 2012-01-02
    • 2017-08-05
    • 1970-01-01
    • 2012-03-08
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多