动态加载一些缺失的函数

时间:2014-07-06 10:20:46

标签: macos dyld wcsdup

我有一个二进制文件,宣传为在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这样做?

2 个答案:

答案 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

这有助于加载应用程序,但在此之后执行会陷入僵局。