问题标签 [dyld]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
195 浏览

macos - dyld:强制绑定来自特定库的符号

由于一段不幸的历史,OpenAL.framework 包含 ALUT 1.0 的符号。我正在开发一个受益于 ALUT 1.1 的项目,因此我将 ALUT 编译为一个框架(来自 freealut 源代码)。

不幸的是,这意味着在 ALUT.framework 和 OpenAL.framework 中都定义了某些符号,我真的需要一种方法来确保优先选择 ALUT 符号。我在链接命令上在 OpenAL 之前订购了 ALUT,因此在最终二进制文件的 otool 输出中,但是(由于延迟绑定?)在一种情况下选择了 OpenAL 符号。(实际上在应用程序关闭时,alutExit 调用出错了)

我意识到这与 dyld 的设计不一致,但我坚持使用官方的 Apple OpenAL 框架。我可以破解我的 ALUT 框架以使用自定义符号名称,但我希望有一个更简洁(如果 hacky)的解决方法来强制所有 ALUT 符号在考虑 OpenAL 之前贪婪地绑定。

0 投票
1 回答
571 浏览

ios - IOS 上的 LC_LOAD_DYLINKER 和自定义链接器

在查看 Mach-O 文件支持的 LC_ 命令列表时,我注意到 LC_LOAD_DYLINKER 命令,它指定使用哪个动态链接器。

在 IOS 上,这似乎总是指向同一个位置,即设备上的标准 DYLD。

我很好奇 IOS 是否支持使用此命令的自定义链接器,如果支持,它们是否有任何创建链接器的指南?有没有人这样做过?

0 投票
1 回答
2063 浏览

macos - Mac OS X 应用程序可以阻止 dlopen 加载库吗?

经过仔细调试后,我在我的应用程序中发现了一个错误,该错误植根于加载有问题的 Apple 包的系统框架中:

我确信我没有从该捆绑包的服务中受益,并且怀疑许多应用程序是否受益。事实上,我通过研究 Xcode 本身了解到,捆绑包不能加载到 Xcode 的内存空间中,因为捆绑包不兼容垃圾收集。

所以理想情况下,我也想阻止这个包被加载到我的应用程序中。一种方法是在我自己的应用程序中要求 GC,但我不打算这样做。任何人都可以想出一种方法来规避系统框架调用dlopen()这个库的尝试吗?

0 投票
2 回答
3295 浏览

linux - 在 Linux 中共享可执行内存页?

为了节省空间,是否可以在 Linux 上共享可执行页面?我知道有共享内存 API 可用于在不同进程之间共享内存,但我不认为这意味着要使用它。

基本上,我想要一个共享内存区域,可以将一些常用的共享库加载到其中。我想让动态链接器链接到预加载的(只读)图像,而不是必须将所有共享库图像加载到每个进程中(这似乎是一种浪费)。

这在 Linux 内核上可行吗?Darwin 内核使用 Mach VM 的一个称为commpages的功能来实现这一点(dyld 共享缓存存储在那里)。commpages 可以访问并在每个进程之间共享。

澄清一下,我知道共享对象(库)是什么。目前,动态链接器在 Linux 上所做的是将所有需要的库加载到程序的地址空间中,这意味着每个链接到 libc 的应用程序(例如)将在其地址空间的某个位置有一个 libc 的图像。在 Darwin 上,可以通过将 libc 的可执行(和其他只读)部分放在一组共享内存页面上来消除此问题。共享图像的可写部分仍然是分开的。

编辑:我知道 ELF 格式不支持分隔共享库的 DATA 和 TEXT 段。我没有使用 ELF,我使用的是不同的二进制格式(使用我自己的 binfmt 内核模块和我自己的动态链接器)。如果 Linux 内核支持类似 commpage 的功能,我很感兴趣。

编辑2:我能想到的唯一方法是在内核中分配一大块内存并将其映射到每个执行的二进制文件中。第一次执行任何二进制文件时,动态链接器可以取消保护它,用所需数据填充它并保护它。然后不知何故,内核必须确保内存段没有被其他任何东西修改,因为它会打开一个巨大的安全漏洞。其他

0 投票
0 回答
350 浏览

c - 分析项目时如何解决 dyld 和 localtime 泄漏?

我正在分析我的来源。当我运行时,我看到一些在退出时仍然存在的分配valgrind
这是摘要:

负责的图书馆是:

dyld:所有 81 个 malloc 都有共同的调用:(不知道)

代号

{libsystem_c, libsystem_notify, libdispatch}.dylib:所有 10 个 malloc 都有共同的调用:

当地时间

localtime(...)在用于初始化和返回我不应该的time.h用途中定义,因为我没有分配它。tzset(...)struct tm*free

如何恢复这些仍然可以访问的 20,228 字节?

更新


我正在运行 Mac OS X

0 投票
1 回答
873 浏览

linker - 如何解析 dyld 导入的符号?

我正在尝试实现 dyld 所做的某些部分,但我有点卡在 stub trampolines 上。

考虑以下 ARM 指令:

它通过链接(子过程调用)分支到 0x2fec。我知道这样一个事实,在 __TEXT 段中有一个 __symbolstub1 部分从 0x2fd8 开始,所以它是 __symbolstub1 内部的 20 个字节的跳转。

现在有一个符号

我已经通过 LC_SYMTAB 加载命令解决了。没有提供已知地址。事实上,我知道 0x2fec 地址是 _objc_autoreleasePoolPush 的蹦床,但我无法通过任何方式证明这一点。

我检查了 LC_DYLD_INFO_ONLY 命令,在我发现的lazy_bind 符号中,我有一点提示:

其中名称和偏移量与我所拥有的完全匹配,并且库#6 是“/usr/lib/libobjc.A.dylib”,这也是完美的。现在的问题是段#2 是__TEXT,但__TEXT 从0x1000 开始,而__symbolstub1 在0x2fd8 处。所以我错过了一些参考。

关于我应该如何将 0x2fec 虚拟地址映射到 _objc_autoreleasePoolPush 的任何想法?

0 投票
1 回答
2130 浏览

ios - iPhone上的dyld API - 奇怪的输出

我有三个问题要问你,都与 dyld 相关 :)

我一直在使用这个 dyld 手册页作为基础。我已经编译了以下代码并在我的越狱设备上成功执行了二进制文件。

我认为这些函数可以让我找到加载到我的程序地址空间中的所有共享库。在我的 Mac 上,输出非常简单:它显示了当前加载到内存中的所有库的路径。在我的 iPhone 上,输出几乎相同——我也获得了文件路径——但指定位置没有文件。(另一方面,在我的 Mac 上,我可以找到文件!)

这是输出中的示例行:/usr/lib/system/libdyld.dylib

根据 ls、iFile 和我使用的所有其他工具,这个目录(/usr/lib/system/)是空的。为什么?那些文件在哪里?

我想知道的另一件事是:是否可以在内存中找到一个库?从什么偏移量到库映射到内存的偏移量?我想我知道如何找到开始,但我不知道如何找到图书馆的尽头。要找到开头,我会使用 _dyld_get_image_header 返回的地址 - 对吗?

最后一个问题:我想在系统范围内加载一个动态库,所以我认为我可以使用 DYLD_INSERT_LIBRARIES 来做到这一点。但是,我在插入 lib 后尝试执行的每个二进制文件都会崩溃并产生总线错误!我是否忘记了什么或者是导致崩溃的动态库?

0 投票
2 回答
1435 浏览

ios - dyld 问题(库未加载)

我在构建项目时收到此消息:

dyld:库未加载:

这是动态链接错误,据我了解,更正此错误是因为找不到图像。这个对吗?

应该采取哪些步骤来解决错误?

我找到了这个链接,据我所知,这个错误是因为我使用的是 xcode 4.3。现在我在 4.2 上尝试了这个,一切都很好。

但我不知道如何在 XCode 4.3 上运行它

0 投票
1 回答
5755 浏览

ios - dyld 问题库未加载

当我尝试构建目标时,动态链接器出现此错误:

我使用上面路径上引用的这个 iphonesim 库链接

我使用 Xcode 4.3,在这种情况下,我认为路径错误。

如何将此路径更改为正确路径?

0 投票
1 回答
2485 浏览

macos - info.plist 的 LSEnvironment 部分不起作用。

我编写了一个动态库,通过设置名为 DYLD_INSERT_LIBRARIES 的环境变量加载到一些目标应用程序中,dylib 加载并在应用程序通过以下命令从终端执行时工作正常:

然后我通过编辑 info.plist 文件中的 LSEnvironment 部分来设置 DYLD_INSERT_LIBRARIES 的值。一些苹果标准应用程序,如 TextEdit 和 Calculator 成功加载了我的库,但此设置对 InDesign、Photoshop 等应用程序没有影响...

为什么没有为某些应用程序设置环境变量?有人对此有想法吗?谢谢你。