問題タブ [bfd]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 共有ライブラリを含む C++ アプリケーションのコールスタックを取得する
アドレスを解決するために bfd を使用して、C++ でコールスタックを作成する小さな関数を作成しました。正常に動作し、現在のアプリケーション内のすべての関数の詳細情報 (ソース ファイルと行) を取得しますが、アプリケーションに含まれる共有ライブラリに関する情報はまったく得られません。
例えば:
ご覧のとおり、アプリケーションにリンクされた実行可能ファイルと静的オブジェクトのシンボルは正しく解決されていますが、上位範囲のアドレス (例: 0x00002b54229ba6d3) は解決されていません。これらのアドレスは、アプリケーションまたは共有ライブラリ ファイルの一部ではありません。このようなさらなるツールaddr2line
は、その命令の位置を再構築することもできません。
これらのアドレスをbfdツールで解決できないことは、ディスク上のファイルを開いてシンボルを取得するだけである限り(現在行っていることはabfd = bfd_openr("/proc/self/exe", 0);
)、現在実行中のプロセスのbfdを取得する方法はありますか(したがって、共有ライブラリのセクションを含めます)?そうでない場合: ロードされた共有オブジェクトとそのオフセットのリストを取得するにはどうすればよいですか? また、これらのオフセットをディスク上の共有オブジェクト ファイルに関連付けるにはどうすればよいですか (.so ファイルの bfd を個別にロードできるように)。
g++ - g++ 2.96 の lib ビルドを新しい BFD 形式に変換するには?
g++ バージョン 2.96 を使用してビルドされたライブラリ ファイルがあります。lib のソース コードは入手できず、元の開発者からのサポートもありません。
最新の g++ バージョン (4.x など) を使用してアプリケーションにリンクしたいと考えています。私が理解しているように、gcc veriosn 3.3 以降、名前マングリング スキームが変更されました。そのため、新しいリンカーは古い lib ファイルのシンボルを認識しません。
私はネットでいくつかの調査を行い、objcopy、objdump、c++filt、nm などのツールを調査し、lib ファイル内のシンボルを手動で見つけてデマングルしようとしましたが、役に立ちませんでした。
それで、新しいコンパイラを使用してリンクできるように、古いバイナリ lib ファイルを新しい名前マングリング スキームに変換する方法 (またはツール) はありますか?
c++ - BFD ライブラリにクラス メンバー関数の場所を見つけさせる
関数を使用して、関数bfd_find_nearest_line
のソースの場所を見つけています(デバッグシンボルを含む実行可能ファイルから--compiled with -g
)。当然、引数の 1 つは、検索したい関数へのポインターです。
https://sourceware.org/ml/binutils/2000-08/msg00248.html
かなりの量の (純粋な C) ボイラー プレートの後、これが通常の関数 (通常の関数ポインターが にキャストされる*void
) で動作するように管理しました。
たとえば、これは機能します:
問題はbfd_find_nearest_line
、クラス メンバー関数のソース コードを検索するために使用できるかどうかです。
クラス メンバ関数 (この場合は type の場合int (A::*)()
) は関数ではありません。特に、 は関数ポインタにキャストできませんvoid*
。ここを参照してください: https://isocpp.org/wiki/faq/pointers-to-members#cant-cvt-memfnptr-to-voidptr
この背後にあるロジックを完全に理解していますが、メンバー関数ポインターは、BFD に関数を識別させるためにメンバー関数の情報を取得する唯一のハンドルです。このポインターで関数を呼び出したくありません。
私は多かれ少なかれ C++ がどのように機能するかを知っています。コンパイラは同等の free-C 関数を静かに生成します。
しかし、この無料関数のアドレスにアクセスする方法、またはそれが可能かどうか、ライブラリがこのポインターを介してbfd
元のソースの場所を特定できるかどうかはわかりません。my_member_function
(現時点では、少なくとも私は仮想関数には興味がありません。)
言い換えると、
1)bfd
メンバー関数を見つけることができるかどうかを知る必要があります。
2)そして、可能な場合、型のメンバー関数ポインターを()を取ることができるint (A::*)()
引数にどのようにマップできますか。bfd
void*
ポインターが存在することは他の手段 (スタック トレース) で知ってい_ZN1A18my_member_functionEv
ます&(A::my_member_function)
。
c - 関数名への命令ポインタ、入力パラメータ、?
関数呼び出しのようなバックトレースを自分で実装しようとしています。スタックの展開に成功し、すべてのリターン アドレスがスタックに存在します。この情報から、関数名、関数への変数名入力を取得したいと思います。また、これをプログラムで実行したい、つまり、実行時に、プログラムでこれまでに呼び出されたすべての関数に関する情報を取得できる必要があります。コンパイル中に -g フラグを付けてコンパイルしても問題ないと仮定しましょう。
関数名を取得するために dladdr() 関数を使用しようとしていますが、これは機能しませんでした。「エラー:不明なタイプ名 'Dl_info'」というエラーが表示されます。ここに私のコードスニペットがあります:
私は bfd ライブラリを調査しようとしましたが、良い例/チュートリアルがありませんでした。ubuntu 14.04を使用しています
c - 変数名、C での実行時の関数引数
Cプログラムで実行時に関数の引数と変数の名前の型を知ることは可能ですか? たとえば、関数がある場合:
この関数内で、引数と変数abc()
の名前を知ることができますか?x
y
z
a
b
int
float
somestruct
char
int
別の機能がある場合は、次のように言います。
my_struct
引数名は、index
型はspecialstruct
、であることを知っておく必要がありますint
。
実行時にこの情報が必要ですか?
ベース ポインターとリターン アドレスにアクセスできます。上記のポインターを使用して必要な情報を取得できますか。
戻りアドレスとdladdr()
関数を使用して関数名を抽出できました。
私GDB
はこれを行うので、この情報を抽出することは可能でしょうか?