6

我想在 OSX 上部署一个 .dylib,它是用 Delphi 创建的。这个 .dylib 应该可以被第三方应用程序加载

这似乎是一个重复的问题,但经过大量搜索,我找不到答案。与此问题相同:https ://forums.embarcadero.com/thread.jspa?messageID=592417

问题是 .dylib 需要,但从第三方应用程序运行时libcgunwind.1.0.dylib找不到它。作为测试,我尝试复制到,并且有效。当 OSX 找不到 .dylib 时,它总是会在 .dylib 中搜索。不幸的是,我不想将其作为最终解决方案,因为它需要提升权限,并且似乎是处理简单问题的一种严厉方式。libcgunwind.1.0.dylibusr/libusr/lib


仔细检查一下,我曾经otool检查过我的 .dylib,它给了我以下路径:@rpath/libcgunwind.1.0.dylib.

@rpath问题是,当您的 .dylib 由第三方应用程序运行时,没有考虑将在 中列出哪些路径。为此,应用程序必须始终提供指向libcgunwind.1.0.dylib.

显而易见的解决方案是使用install_name_tool替换@rpath@loader_path。如果我的逻辑是正确的,这应该会导致我的 .dylib 总是 find libcgunwind.1.0.dylib,只要它们在同一个文件夹中。这是有道理的,因为 .dylib 应该负责找到自己的依赖项。

所以,我尝试了以下命令行:

install_name_tool -change @rpath/libcgunwind.1.0.dylib @loader_path/libcgunwind.1.0.dylib libTest.dylib

并收到此消息:

install_name_tool: file not in an order that can be processed (local relocation entries out of place): libTest.dylib

我为此错误消息进行了一些搜索,但我无法找到有关它的任何信息。我必须假设install_name_tool期望在 gcc 或 llvm 构建的 .dylib 中找到一些特定的约定,并且 Delphi 的编译器没有提供这些约定。

我在 Delphi 的编译器中进行了一些挖掘dccosx,并检查了 Delphi 发送给它的命令行参数,但我找不到任何有用的选项。这种使用libcgunwind.1.0.dylib, 似乎对编译器来说是隐含的,而不是我可以调整的。

我并不是说这是解决问题的正确方法,这些只是我尝试过的最新方法。如果您能想出不同的解决问题的方法,请分享您的想法!

4

1 回答 1

3

install_name_tool 似乎要求 dylib 的某些部分按特定顺序排列,例如“本地重定位条目”然后是“符号表”、“本地符号”……错误消息意味着此顺序与预期不符。

我的建议是您尝试修补 dylib 文件。我一直使用 OSX 可执行文件这样做,因为我需要告诉他们它们与哪些 dylib 版本兼容。这修复了 Delphi OSX 应用程序中的几个错误。dylib 具有与可执行文件非常相似的结构。我的经验是修补这些文件并不像听起来那么复杂。

您可以在此处找到文件结构的描述: https ://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html

LC_LOAD_DYLIB 部分是您需要查看的部分。您应该能够用更长的名称替换 dylib 名称,因为这部分通常有一些额外的填充。

于 2014-05-12T13:40:56.980 回答