2016-04-27 18 views
0

私は、モジュール定義ファイル(.def)と書き出しのフレンドリ名を使用して、dll(windows)から関数をエクスポートする私の方法について面白いことを発見しましたが、どのようにMacでそれを行うことができます。.defファイルと同等のOS X

私はOS X上モジュール定義の任意の等価があるかどうかを知りたい

+0

あなたは[この質問のような意味です](http://stackoverflow.com/questions/4506121/how-to-print-a-list-of-symbols-exported-from-a-dynamic-library)? – tadman

答えて

1

(私はそれを理解している場合)を用いて達成することができるか、あなたが探しているの主要部分-alias <symbol_name> <alternate_symbol_name>とリンカーに-alias_list <filename>オプション(ld)。 -exported_symbol <symbol>-unexported_symbol <symbol>とファイルリストの対応部分-exported_symbols_list <filename>-unexported_symbols_list <file>を使用して、追加の制御を実現できます。エクスポートされたシンボルに単純な命名規則を強制的に.defファイルを使用して

1

は本当に進むべき道ではありません - あなたはそのレベルでの問題をマングリングしている一般たら、何か他のものが間違って行くことは良いチャンスがあります。あなたの質問のC++タグに基づいています。

C++コードを接続しようとすると、コンパイラ/リンカーはエクスポートするコードに合わせて適切なマングリングを生成しますので、リンカエラーが発生するとバイナリ互換性あなたが潜在的に互換性のないアロケータなどに迷い込んでいる可能性があります。

単純な「C」APIをエクスポートすると、リンクの複雑さが軽減されます。明確なCリンケージがありますルーチンはリンクするための単純な名前を取得します。

これは.hファイルで警備員の一般的な目的である:

#ifdef __cplusplus 
extern "C" { 
#endif 

… library exports … 

#ifdef __cplusplus 
} 
#endif 

これは、自動的にC++コードとリンクしようとしたとき、あなたが正常に見ることが回旋よりに対してリンクするため、あなたが極めて単純名を取得します - 限り .hファイルを.cppファイルをコンパイルするとき、.hにエクスポートするルーチンの宣言があり、対応する定義が.cppにある限り、それらは自動的にデマングルされてエクスポートされます。

Ken Thomasesの答えはまだ使用できます。記号の表示と記号のエイリアスが表示されますが、TBHでは、Windowsで使用していたソリューションを別のプラットフォームに合わせようとしているようですしかし、私にとっては、あなたが最初にWindowsプラットフォームで間違ったアプローチを使用してきたように思えます。

歴史/リンケージ解説:

私はまた、Windows上の.defファイルのサポートは、実際にWindows上で異なる輸出メカニズムによって引き起こされていることを言及するつもりです - それは、もともと序によって.dllファイルからシンボルをエクスポート - すなわち、番号であるので、defファイルを使用して、呼び出し規約のようなものを理解するために、名前のリンケージを問題の番号に再マッピングしなければなりませんでした。ほとんどのunix/linuxシステムでは、番号付きインデックスだけがエクスポートされることはありませんでした。つまり、APIで定義された名前を直接リンクすることができます。
Windowsからエクスポートされた関数名の末尾にあるわずかにマンガの@<number>の項目は、最近、パラメータに必要なバイト数を示しています。__stdcall呼び出し規約では、呼び出された関数が返される前にスタックからそのバイト数をポップすることを呼び出し元が理解できるように、呼び出し元が関数呼び出しの余分なパラメータをクリーンアップできるように、これを追加しています理論的に - バリデーションルーチンは、デフォルトでこの問題を解消するためにコンパイラによって自動的にcdecl呼び出し規約に変換されます)。
他のプラットフォームのABIは、呼び出し元と呼び出し先の間でスタッククリーンアップの責任を分けることができる呼び出し規約を使用しないため、デフォルトで '保護'のようなmanglingが発生しません。

+0

詳細な回答ありがとうございます、私は確かに私のアプローチのいくつかを再考する必要があります。 私はKen Thomasesに、質問に直接答えるので、追跡目的のために受け入れられたと答えていますが、あなたの1つは非常に役に立ち、私のことを考えさせました。 – user3081123