2012-02-13 13 views
2

私は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の呼び出しで停止します。

enter image description here

私はファインダー(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の宣言が初期化セクションで使用されている適切なクラスに変更されます。

+0

nm:オブジェクト:libLibTest.dylib不正なオブジェクト(間接的なテーブル(オフセット509728、サイズ576、セクションの内容がオフセット507904、サイズ67082) ...テストライブラリは有効ですか? – Petesh

+0

私はこの図書館が有効であることを希望しますが、わかりません。そうでなければ、Delphi XE2はライブラリに変換された最も基本的なコードなので、これは壊れています。実際、nmはライブラリが無効だと思っていましたが、otoolが輸出品をうまく出力するのを見ました。 – msohn

+0

nm、otool、およびdyldは、ファイル内の関連する要素を読み取るために異なるコードを使用しています。 nmの苦情がdyld呼び出しの失敗の原因になる可能性があります。私はIDAを使ってTestLib呼び出しを逆アセンブルし、intではなくint *をパラメータとして取るように見えます。これにより、呼び出し時にアクセス違反が発生するという副作用があります。しかし、その前にエラーが発生しているように見えます(ライブラリの読み込み時) – Petesh

答えて

2

ビルドしているライブラリの暗黙の依存性はbplrtl160.dylibです。これは、アプリケーションとバンドルする必要があります。ライブラリは、実行時パッケージを使用してビルドされていることを確認する必要があります。

問題を引き起こしているxcodeでアプリケーションをビルドしたときに発生しない、Delphi XE2で実行可能ファイルをビルドすると起こる初期化の魔法があります。おそらく、ライブラリに作成されたときにリンクされていないアプリにリンクされている初期化コードです。

あなたが取得している実際の例外はである:

bplrtl160.dylib 負荷時間(すなわちで起こっている
@[email protected]@IReadWriteSync 

あなたはこの点までに図書館とやりとりすることさえありません)。これはアプリケーションのロード時に初期化されるべきインタフェースクラスです。

System.SysUtils, System.Classesエントリをライブラリファイルのuses句から削除すると、実際にライブラリがロードされます。 XE2からビルドしたライブラリではクラスとsysutilsコードを使用できないことを意味します。それは使用に適しているより少し少なくなります。

修正については、知りません。修正はまったくないかもしれません。

+0

ありがとう、私はuses節にRTL単位を持たないlibで動かすことができました。しかし、あなたが言及したように、それはあまり役に立ちません。 – msohn

+0

ランタイムパッケージを有効にすると、RTLパッケージに依存することになりますが、これははっきりしています。なぜRTLをdylibにコンパイルしているのですか?ランタイムパッケージを使用してコンパイルしない場合、rtl dylibをProductsディレクトリに配置しても違いはありません。 – msohn

+0

ランタイムパッケージを有効にしてからanyを使用しないと、コードはbpl160.dylibにリンクされず、クラッシュしません。静的にリンクすると、bpl160.dylibの静的変数にコンパイルされ、ライブラリがロードされたときに問題が発生します。テストライブラリを-lazy-lLibTestを使用してリンクすると、エクスポートされた関数の最初の呼び出し時に問題が発生します(これが問題を追跡した方法です)。共有パッケージを使用する理由は、Windowsの場合と同様の実行時の問題によるものです。 – Petesh

関連する問題