【问题标题】:How to create an absolute path reference in a dylib?如何在 dylib 中创建绝对路径引用?
【发布时间】:2014-06-10 16:39:45
【问题描述】:

[免责声明:我正在使用其他人的代码。我从未创建过 .dylib,所以我求助于 S.O.]

我正在开发一个创建 .dylib 的发行版。看起来不错,但是当我链接它时,生成的可执行文件会崩溃:

dyld: Library not loaded: libstk.dylib.4.4.4
  Referenced from: /Users/r/Projects/Mu/examples/./mune31
  Reason: image not found 
Trace/BPT trap: 5

当我使用 otool 检查可执行文件时,问题很明显:libstk(最后一个条目的下一个)具有相对路径,而不是绝对路径。 (顺便说一句,它没有正确设置兼容性或当前版本。)

Mu[~/Projects/Mu/examples]$ otool -L ./mune31
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
        /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio (compatibility version 1.0.0, current version 1.0.0)
        /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 855.16.0)
        /System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI (compatibility version 1.0.0, current version 73.0.0)
        /Users/r/Projects/Mu/usr/lib/libgsl.0.dylib (compatibility version 18.0.0, current version 18.0.0)
        libstk.dylib.4.4.4 (compatibility version 0.0.0, current version 0.0.0)
        /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)

问题

此发行版使用 g++(而不是 clang)作为其编译器。当前创建 .dylib 的咒语是:

g++  -fPIC -dynamiclib -o libstk.dylib.4.4.4 Release/*.o -lpthread -framework CoreAudio -framework CoreFoundation -framework CoreMidi
install -m 644 libstk.dylib.4.4.4 /Users/r/Projects/Mu/usr/lib

用绝对路径创建 .dylib 应该读什么?

更新

出于向后兼容性的原因,我们希望在构建时为 dylib 保留一个相对名称(即,我们不想将 -install_name 参数传递给 g++ -fPIC ... 命令)。

有没有办法在 dylib 构建为具有绝对路径名后对其进行调整?当我在现有文件上运行 otool -L 时,我看到:

$ otool -L libstk.dylib.4.4.4
libstk.dylib.4.4.4:
    libstk.dylib.4.4.4 (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 855.16.0)
    /System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI (compatibility version 1.0.0, current version 73.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)

我希望第一行是

    /MySandbox/whatever/libstk.dylib.4.4.4 (compatibility version 0.0.0, current version 0.0.0)

附言

如果有人像我一样不耐烦,您可以使用install_name_tool 作为解决方法来更新可执行文件,如下所示:

install_name_tool -change libstk.dylib.4.4.4 ../usr/lib/libstk.dylib.4.4.4 mune31

...但是每次构建可执行文件时不必这样做肯定会很好。

【问题讨论】:

  • 你试过在dylib本身上使用install_name_tool吗?
  • @nneonneo:谢谢,但我试过了。使用 -change 参数,它并没有改变 dylib。并且使用 -rname 参数,它给出了一个错误。
  • 使用-id 选项。您正在尝试更改 dylib 自己的 ID,以便链接器将该 ID 作为引用合并到可执行文件中。
  • @KenThomases:太棒了——谢谢。请作为答案提交,以便我给它检查。

标签: macos dylib dyld otool install-name-tool


【解决方案1】:

在链接可执行文件之前,您可以使用install_name_tool-id 选项来更改dylib 的ID。链接器使用 ID 作为对烘焙到可执行文件中的库的引用。

当您希望使用 install_name_tool 修改二进制文件中的路径时,您应该指定以下链接器选项之一:-headerpad <size>-headerpad_max_install_names

【讨论】:

  • +1 表示 -headerpad / -headerpad_max_install_names 提示——否则我不会知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 2016-09-28
  • 2019-02-08
  • 2022-06-19
  • 1970-01-01
相关资源
最近更新 更多