首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么一个自由Pascal需要DYLD环境变量?

为什么一个自由Pascal需要DYLD环境变量?
EN

Stack Overflow用户
提问于 2019-04-12 23:25:45
回答 1查看 213关注 0票数 0

我有一个Mac应用程序,大部分是用Xcode构建的,它使用一个动态库(dylib),这个库是通过Lazarus用Free构建的。当我打开Apple的“硬运行时”特性时,dylib停止工作,直到我检查了“允许DYLD环境变量”选项。这被描述为“允许应用程序受到DYLD环境变量的影响,而DYLD环境变量可以用来向进程注入代码”。那个代码注入位听起来像是我想避免的东西。知道为什么会发生这种事或者我能做些什么吗?

要回答评论中提出的一些问题:

我不知道到底是什么失败了,因为我没有写dylib。它可能一直在试图通过互联网与服务器对话。我现在所知道的是,它返回了一个意外的和没有帮助的错误代码。

该应用程序使用dlopen和dlsym调用dylib中的函数。dylib位于应用程序的内容/框架子目录中。该应用程序不设置任何环境变量,无论是在Info.plist中还是在代码中。

dylib的otool -L输出:

代码语言:javascript
运行
复制
@rpath/lib<redacted>.dylib (compatibility version 0.0.0, current version 0.0.0)
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 22.0.0)
/usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1258.1.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1259.0.0)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1404.47.0)
/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 48.0.0)
/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 728.13.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

主要可执行文件的otool -L输出:

代码语言:javascript
运行
复制
/System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 58286.251.4)
/System/Library/Frameworks/AVFoundation.framework/Versions/A/AVFoundation (compatibility version 1.0.0, current version 2.0.0)
/System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox (compatibility version 1.0.0, current version 492.0.0)
/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
/System/Library/Frameworks/CoreMedia.framework/Versions/A/CoreMedia (compatibility version 1.0.0, current version 1.0.0)
@rpath/Quesa.framework/Versions/A/Quesa (compatibility version 1.6.0, current version 2.0.0)
@executable_path/../Frameworks/Ming.framework/Versions/A/Ming (compatibility version 0.0.0, current version 0.0.0)
@rpath/SBEngineLib4.framework/Versions/A/SBEngineLib4 (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Quartz.framework/Versions/A/Quartz (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 274.22.0)
/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 50.1.0)
/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 158.0.0)
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 23.0.0)
/System/Library/Frameworks/AddressBook.framework/Versions/A/AddressBook (compatibility version 1.0.0, current version 1893.0.0)
/System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration (compatibility version 1.0.0, current version 963.250.1)
/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
/System/Library/Frameworks/WebKit.framework/Versions/A/WebKit (compatibility version 1.0.0, current version 607.1.40)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1570.15.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.4)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.250.1)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1671.40.118)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1570.15.0)
/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 944.3.0)
/System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo (compatibility version 1.2.0, current version 1.5.0)
/System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore (compatibility version 1.2.0, current version 1.11.0)

更新:我在dlopen设置了一个断点,发现所讨论的dylib试图按名称而不是完整路径打开另一个dylib,libiconv.dylib。结果表明,在没有特殊权限的情况下,在强化的运行时失败。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-16 21:52:29

自由Pascal显然只使用文件名而没有路径来执行dlopen("libiconv.dylib", ...)。这依赖于dyld$LD_LIBRARY_PATH$DYLD_LIBRARY_PATH、当前工作目录和$DYLD_FALLBACK_LIBRARY_PATH中的搜索(或者,如果最后一个是未定义的,则是$HOME/lib/usr/local/lib/usr/lib)。

但是,如果没有允许的DYLD环境变量权限,dyld将不会在任何地方搜索硬化的运行时进程。只有完整的道路才能起作用。

dylib要么必须更改(如果可以的话),要么需要启用DYLD环境变量,尽管存在风险(我不认为这种风险特别严重)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55660597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档