【问题标题】:Why shared library path is hardcoded in execuatble?为什么共享库路径在可执行文件中硬编码?
【发布时间】:2012-07-03 06:45:40
【问题描述】:

最近我得到了一个测试二进制文件。当我使用 objdump 检查它时,我观察到它包含硬编码的库路径。为什么需要像这样对路径进行硬编码?路径不应该取自 SHELL 环境变量或 -L 参数吗?

objdump -p 测试程序

输出包括共享库的硬编码路径:

....
  NEEDED      /home/test/lib/liba.so
  NEEDED      /home/test/lib/libb.so
  NEEDED      /home/test/lib/libc.so
....

【问题讨论】:

  • 也许这是您系统上的解析路径?
  • 同意 RedX。执行strings testprog | grep /home/test 时,你真的得到任何输出吗?
  • @NiklasB。字符串给了我上面所有的嵌入路径。它在编译期间被硬编码在二进制文件中。
  • @Lunar:你用什么编译器?
  • @NiklasB。我从客户那里收到了那个二进制文件。他们正在使用 gcc(Arm gcc)。我认为嵌入库路径是一项标准功能。但我不明白为什么它是嵌入的。我也很想知道是哪个编译器选项导致该路径被嵌入(我无法从客户那里获得源代码)

标签: c linux gcc


【解决方案1】:

这可能是因为这三个.so 文件在构建您的测试程序的主机上没有 SONAME。告诉构建它的人用-Wl,soname,liba.so 重建liba.so,其他两个类似,然后重新链接主程序。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2010-12-19
  • 2022-11-10
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 2012-09-16
相关资源
最近更新 更多