0

wcsdup()Mac OS X 10.6 で動作すると宣伝されているバイナリがありますが、10.7 でのみ追加された機能であるリンクを試みます。これは、10.6.8 での起動時に生成されたバグ レポートからの抜粋です。

プロセス: paradiseperfectboatrescue [149]
…
コードタイプ: X86-64 (ネイティブ)
親プロセス: launchd [86]
…
OS バージョン: Mac OS X 10.6.8 (10K549)
…
ダイルド エラー メッセージ:
 シンボルが見つかりません: _wcsdup
 参照元:…/Paradise Perfect Boat Rescue.app/Contents/MacOS/paradiseperfectboatrescue
 想定される場所: /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にこれを行うように指示することは可能ですか?

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_PRELOADLinux のようなものです...ライブラリ パスのリストを提供して、実行可能ファイルが必要と認識しているライブラリを検査するのではなく、特定のファイルから関数をロードし、他の場所でそれらを検索しないようにします。

于 2014-07-06T12:19:56.407 に答える
1

ジョンの回答にリンクされているページがなくなった場合の記録として、私がしたことは次のとおりです。

$ gcc -Wall -o wcsdup_ov.dylib -dynamiclib wc
$ エクスポート DYLD_FORCE_FLAT_NAMESPACE=1
$ エクスポート DYLD_INSERT_LIBRARIES=$HOME/wcsdup_ov.dylib
$ open ~/Desktop/Paradise\ Perfect\ Boat\ Rescue.app

これはアプリケーションのロードに役立ちましたが、その後すぐに実行がデッドロックに陥ります。

于 2014-07-06T12:57:14.580 に答える