【问题标题】:Shared library absolute path in ELF fileELF 文件中的共享库绝对路径
【发布时间】:2017-07-11 09:47:07
【问题描述】:

我必须使 ELF 文件使用库的绝对路径,而不是在默认路径 (RPATH) 中搜索。

这是来自 readelf 的结果:

readelf -d example

Dynamic section at offset 0xe28 contains 24 entries:
Tag        Type                         Name/Value
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

但我想得到这样的东西:

readelf -d example

Dynamic section at offset 0xe28 contains 24 entries:
Tag        Type                         Name/Value
0x0000000000000001 (NEEDED)             Shared library: [/lib/libc.so.6]

是否有任何链接器选项可以实现此目的?

【问题讨论】:

标签: gcc linker ld elf toolchain


【解决方案1】:

你想要的工具是ldd,因为这些绝对路径不是ELF文件的一部分,而是由动态加载器决定的。 ldd 是环境变量的包装器,它会导致动态加载器将路径输出到将被(或已经被加载,取决于你如何看待它)加载的库。

当然,库解析是一项特定于系统的任务,即使安装相同的发行版,您的结果也可能会有所不同。

【讨论】:

  • 您可能想为此提供理由? DT_NEEDED 用于向加载器提供在哪里找到库的指示——显然,通过上面的 readelf 输出,文件没有绝对路径,它实际上是字符串“libc.so.6”——它是动态加载器加载它。这不像我已经 10 年没有写过关于 ELF 的文章了……blog.flameeyes.eu/tags/elf
  • 我认为 OP 询问是否可以在 DT_NEEDED 中实际存储绝对路径。
  • 这不是我阅读问题的方式。也许我确实看错了。请注意,我的评论是为了回复某人告诉我,不知道该评论去了哪里。
【解决方案2】:

AFAIK 将 .so 文件指定为普通输入,使用绝对路径,将导致二进制文件也使用相同的绝对路径引用 .so

不确定它如何与 libc 等默认库一起使用,但您可以尝试添加 /lib/libc.so.6 作为第一个链接器输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 2021-12-14
    • 2018-04-07
    相关资源
    最近更新 更多