我有一个二进制文件,宣传为在Mac OS X 10.6上工作,但它试图链接wcsdup()
,这是一个仅在10.7中添加的函数。这是在10.6.8上启动时生成的错误报告的摘录:
Process: paradiseperfectboatrescue [149] … Code Type: X86-64 (Native) Parent Process: launchd [86] … OS Version: Mac OS X 10.6.8 (10K549) … Dyld Error Message: Symbol not found: _wcsdup Referenced from: …/Paradise Perfect Boat Rescue.app/Contents/MacOS/paradiseperfectboatrescue Expected in: /usr/lib/libSystem.B.dylib …
由于某种原因,开发商尚未解决这个问题,大约6个月前报道过。我想知道是否有希望通过编程工具来解决问题。具体来说,是否有可能指示dyld从其他地方获取wcsdup()
?这是一个简单的功能,假设它是唯一缺少的功能,它可以很容易地实现。这是我将使用的实现,有机会:
#include <wchar.h>
#include <string.h>
#include <stdlib.h>
wchar_t* wcsdup (const wchar_t *s)
{
size_t len = wcslen(s) + 1;
len *= sizeof(wchar_t);
wchar_t *d = malloc(len);
if (d)
return memcpy(d, s, len);
else
return 0;
}
我在其他情况下使用过DYLD_LIBRARY_PATH
,但后来我想帮助dyld找到它错过的整个库。这一次,我的目标不是提供一个完整的新库,而是补充现有的库,其中包含一些使用库补充功能的函数。是否有可能告诉dyld这样做?
答案 0 :(得分:1)
我想你想要DYLD_INSERT_LIBRARIES
,请看这里:http://tlrobinson.net/blog/2007/12/overriding-library-functions-in-mac-os-x-the-easy-way-dyld_insert_libraries/
这就像Linux上的LD_PRELOAD
...而不是提供库路径列表来检查可执行文件知道它需要的库,我们从特定文件加载函数并阻止在其他地方搜索它们。
答案 1 :(得分:1)
对于记录,如果John的答案中链接的页面消失了,这就是我做的:
$ gcc -Wall -o wcsdup_ov.dylib -dynamiclib w.c $ export DYLD_FORCE_FLAT_NAMESPACE=1 $ export DYLD_INSERT_LIBRARIES=$HOME/wcsdup_ov.dylib $ open ~/Desktop/Paradise\ Perfect\ Boat\ Rescue.app
这有助于加载应用程序,但在此之后执行会陷入僵局。