2016-08-27 6 views
2

私は隠されていたC関数の関数名を取得しようとしています。画像のシンボルテーブルには公開されていません。ポインタを指定したコンパイル済みコードから、エクスポートされていないC関数名を取得する。

私はこれをOS Xで行い、dladdrを使用しています.dladdrが成功を返すときは、dli_snameフィールドをチェックしますが、NULLです。

Cの関数名を返す方法はありませんか?私が理解しているように、アンエクスポートされたC関数はインライン化されてしまいますか?

+3

シンボルテーブルにない場合は使用できません。 – Barmar

+0

あなたは精緻化できますか?私はそれにハンドルを得るためにいくつかの適切なキャストを行うことができます。私が欲しいのは、名前を得ることだけです。 –

+1

シンボルテーブルは、名前とアドレスの間の変換を含むデータです。 – Barmar

答えて

3

方法はありません。

インラインであるかどうかにかかわらず、シンボルテーブルにない場合は、デバッグ情報でビルドされていればそれ以外の名前は保存されず、最適化されていてもまだ困難または不可能な場合があります回復します。

たとえば、シンボルテーブルをダンプすることができます。 objdumpあなたが好奇心が強いなら、そこにないものはdladdrを通して利用できません。

+0

ダン、関数のポインタが与えられたときに少なくとも型シグネチャを取得する方法はありますか? –

+0

@Edgar Nope。同じ取引。それはシンボルテーブルにあるものに戻って、マングリングされた名前以外の場所には保存されません(マングリングに署名が含まれている場合のみ)。 –

2

エクスポートされていない関数は必ずしもインライン化されていません(そうしないと関数のアドレスが最初にありません)が、シンボルテーブルにはないので、関連付けられている名前はありません。

すべてのシンボル(GCCの-export-dynamicなど)をエクスポートしない限り、名前を取得する方法はありませんが、そうすることができるかどうかを最初に尋ねることはないと思います。デバッグ情報があれば、それを解析して名前を得ることは可能でしょう。

+0

ダン、関数のポインタが与えられたときに型シグネチャを取得する方法はありますか? –

+0

@ EdgarAroutiounian Nope。その情報はエクスポートされたシンボルでも使用できません(C++名のデマングル化を除く)、あらかじめプロトタイプを作成する必要があります(デバッグ情報がない限り)。 –

関連する問題