gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:01:52 25 4
gpt4 key购买 nike

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

这看起来像是一个重复的问题,但经过大量搜索后,我找不到答案。这是同样的问题:https://forums.embarcadero.com/thread.jspa?messageID=592417

问题是 .dylib 需要 libcgunwind.1.0.dylib ,但从第三方应用程序运行时找不到它。作为测试,我尝试复制 libcgunwind.1.0.dylib进入usr/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 ,似乎对编译器来说是隐式的,我无法调整。

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

最佳答案

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

关于macos - Delphi 生成的 Dylib 在 OSX 上的可靠部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23572281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com