私はDelphi XE2 Updを使用してOS X用に32ビットのdylibを作成しました。 3. install-nameは@rpathを使います。すべてのエクスポートは、otoolで検証されたアンダースコアで始まります。エクスポートは、Delphiで "cdecl"呼び出し規約を使用します。Delphi XE2で作成した.dylibはXcodeアプリケーションで使用できません
このdylibは、OS X 10.7.3で動作するXcode 4.3の32ビットホストアプリケーションでは動作しません。テストプロジェクトをXcodeから実行すると、呼び出しスタック内のlibとdyld_startの呼び出しで停止します。
私はファインダー(Xcodeのフォルダからユーザーのライブラリ内)からこのアプリを実行すると、私はdyldのからの画像が見つからないエラーが発生します。
私はすでにdylib(および必要なlibcgunwind.1.0.dylib)をProductsディレクトリにコピーするコピービルドフェーズを追加しました。また、Runpath Search Pathsを@executable_pathまたは@loader_pathに設定しました。
方法が
extern int TestLib(int AInt);
ライブラリを経由して輸入されたが、それが得ることができる限り最小限で、ちょうどこのユニットが含まれています
unit LibTestExports;
uses
System.Classes,
System.SysUtils;
function _TestLib(AInt: Integer): Integer; export; cdecl;
begin
Result:= AInt + 2;
end;
exports
_TestLib;
end.
私はこれを引き起こしているものにアイデアの出だとどのように私はこれを動作させることができます。
XcodeプロジェクトとLIBSは、ここで見つけることができます:http://dl.dropbox.com/u/17403534/CAS4LibTest.zip
UPDATE:この問題は、ライオン固有のようです! Snow Leopard 10.6.4では、Xcode 4.2を使用して正常に動作します。
FireMonkeyアプリケーションで使用された場合、同じdylibはLionでもうまく動作します(メソッドはexternal 'libName'
を使用して静的にインポートされます)。
SnowLeopardの下で正常に動作ライオンの下で同じアプリを、実行している、私は次のコールスタックを含むクラッシュレポートを取得する:
0 ??? 0x0013317c 0 + 1257852
1 libCAS4.dylib 0x00010b5c @DbgEvalFrame + 1648
2 libCAS4.dylib 0x00010e1a @DbgEvalFrame + 2350
3 dyld 0x8fe55203 ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 251
4 dyld 0x8fe54d68 ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) + 64
5 dyld 0x8fe522c8 ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) + 256
6 dyld 0x8fe5225e ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) + 150
7 dyld 0x8fe53268 ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) + 62
8 dyld 0x8fe47694 dyld::initializeMainExecutable() + 214
9 dyld 0x8fe4bf99 dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**) + 2238
10 dyld 0x8fe452ef dyldbootstrap::start(macho_header const*, int, char const**, long, macho_header const*) + 637
11 dyld 0x8fe45063 _dyld_start + 51
回避策:エンバカデロのサポートは現在、修正、回避策、と戻ってきました私の問題:System.Classesのローカルコピーでは、GlobalNameSpace:IReadWriteSyncの宣言が初期化セクションで使用されている適切なクラスに変更されます。
nm:オブジェクト:libLibTest.dylib不正なオブジェクト(間接的なテーブル(オフセット509728、サイズ576、セクションの内容がオフセット507904、サイズ67082) ...テストライブラリは有効ですか? – Petesh
私はこの図書館が有効であることを希望しますが、わかりません。そうでなければ、Delphi XE2はライブラリに変換された最も基本的なコードなので、これは壊れています。実際、nmはライブラリが無効だと思っていましたが、otoolが輸出品をうまく出力するのを見ました。 – msohn
nm、otool、およびdyldは、ファイル内の関連する要素を読み取るために異なるコードを使用しています。 nmの苦情がdyld呼び出しの失敗の原因になる可能性があります。私はIDAを使ってTestLib呼び出しを逆アセンブルし、intではなくint *をパラメータとして取るように見えます。これにより、呼び出し時にアクセス違反が発生するという副作用があります。しかし、その前にエラーが発生しているように見えます(ライブラリの読み込み時) – Petesh