問題タブ [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.

0 投票する
1 に答える
505 参照

c++ - 共有ライブラリを含む C++ アプリケーションのコールスタックを取得する

アドレスを解決するために bfd を使用して、C++ でコールスタックを作成する小さな関数を作成しました。正常に動作し、現在のアプリケーション内のすべての関数の詳細情報 (ソース ファイルと行) を取得しますが、アプリケーションに含まれる共有ライブラリに関する情報はまったく得られません。

例えば:

ご覧のとおり、アプリケーションにリンクされた実行可能ファイルと静的オブジェクトのシンボルは正しく解決されていますが、上位範囲のアドレス (例: 0x00002b54229ba6d3) は解決されていません。これらのアドレスは、アプリケーションまたは共有ライブラリ ファイルの一部ではありません。このようなさらなるツールaddr2lineは、その命令の位置を再構築することもできません。

これらのアドレスをbfdツールで解決できないことは、ディスク上のファイルを開いてシンボルを取得するだけである限り(現在行っていることはabfd = bfd_openr("/proc/self/exe", 0);)、現在実行中のプロセスのbfdを取得する方法はありますか(したがって、共有ライブラリのセクションを含めます)?そうでない場合: ロードされた共有オブジェクトとそのオフセットのリストを取得するにはどうすればよいですか? また、これらのオフセットをディスク上の共有オブジェクト ファイルに関連付けるにはどうすればよいですか (.so ファイルの bfd を個別にロードできるように)。

0 投票する
1 に答える
35 参照

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 ファイルを新しい名前マングリング スキームに変換する方法 (またはツール) はありますか?

0 投票する
2 に答える
414 参照

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::*)()引数にどのようにマップできますか。bfdvoid*


ポインターが存在することは他の手段 (スタック トレース) で知ってい_ZN1A18my_member_functionEvます&(A::my_member_function)

0 投票する
1 に答える
191 参照

c - 関数名への命令ポインタ、入力パラメータ、?

関数呼び出しのようなバックトレースを自分で実装しようとしています。スタックの展開に成功し、すべてのリターン アドレスがスタックに存在します。この情報から、関数名、関数への変数名入力を取得したいと思います。また、これをプログラムで実行したい、つまり、実行時に、プログラムでこれまでに呼び出されたすべての関数に関する情報を取得できる必要があります。コンパイル中に -g フラグを付けてコンパイルしても問題ないと仮定しましょう。

関数名を取得するために dladdr() 関数を使用しようとしていますが、これは機能しませんでした。「エラー:不明なタイプ名 'Dl_info'」というエラーが表示されます。ここに私のコードスニペットがあります:

私は bfd ライブラリを調査しようとしましたが、良い例/チュートリアルがありませんでした。ubuntu 14.04を使用しています

0 投票する
4 に答える
567 参照

c - 変数名、C での実行時の関数引数

Cプログラムで実行時に関数の引数と変数の名前の型を知ることは可能ですか? たとえば、関数がある場合:

この関数内で、引数変数abc()の名前を知ることができますか?xyzabintfloatsomestructcharint

別の機能がある場合は、次のように言います。

my_struct引数名は、index型はspecialstruct、であることを知っておく必要がありますint

実行時にこの情報が必要ですか?

ベース ポインターとリターン アドレスにアクセスできます。上記のポインターを使用して必要な情報を取得できますか。

戻りアドレスとdladdr()関数を使用して関数名を抽出できました。

GDBはこれを行うので、この情報を抽出することは可能でしょうか?