在OSX上可靠地部署Delphi生成的Dylib

Aud*_*oGL 6 delphi deployment macos rpath dylib

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

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

问题是.dylib需要libcgunwind.1.0.dylib,但是从第三方应用程序运行时它找不到它.作为测试,我试图复制libcgunwind.1.0.dylibusr/lib,而且工作.当OSX无法找到.dylib时,它将始终搜索usr/lib.不幸的是,我不想将此作为最终解决方案,因为它需要提升权限,而且似乎是一种处理简单问题的繁琐方式.


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

问题是,@rpath当您的.dylib由第三方应用程序运行时,无法说明将列出哪些路径.为此,应用程序始终必须提供绝对路径libcgunwind.1.0.dylib.

显而易见的解决方案是使用install_name_tool来代替@rpath@loader_path.如果我的逻辑是正确的,这应该导致我的.dylib总是找到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似乎是编译器隐含的,而不是我可以调整的东西.

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

Seb*_*n Z 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 名称,因为此部分通常有一些额外的填充。