0

我有一个二进制文件,被宣传为在 Mac OS X 10.6 上工作,但它试图链接wcsdup(),这是一个仅在 10.7 中添加的函数。这是在 10.6.8 上启动时生成的错误报告的摘录:

流程:天堂完美救船[149]
…
代码类型:X86-64(本机)
父进程:launchd [86]
…
操作系统版本:Mac OS X 10.6.8 (10K549)
…
Dyld 错误信息:
 未找到符号:_wcsdup
 引用自:…/Paradise Perfect Boat Rescue.app/Contents/MacOS/paradiseperfectboatrescue
 预期在:/usr/lib/libSystem.B.dylib
…

开发人员出于某种原因尚未解决该问题,大约 6 个月前报告。我想知道是否有希望规避编程工具的问题。具体来说,是否可以指示 dyldwcsdup()从其他地方获取?这是一个简单的功能,假设它是唯一缺少的功能,它可以很容易地实现。如果有机会,这是我将使用的实现:

#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 这样做?

4

2 回答 2

1

我想你想要DYLD_INSERT_LIBRARIES,见这里:http ://tlrobinson.net/blog/2007/12/overriding-library-functions-in-mac-os-x-the-easy-way-dyld_insert_libraries/

这就像LD_PRELOAD在 Linux 上......而不是提供一个库路径列表来检查可执行文件知道它需要的库,我们从特定文件加载函数并防止在其他地方搜索它们。

于 2014-07-06T12:19:56.407 回答
1

For the record in case the page linked in John's answer goes away, here is what I did:

$ 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

This helped make the application load, but execution gets stuck in a deadlock shorty after that.

于 2014-07-06T12:57:14.580 回答