関数を使用して、関数bfd_find_nearest_line
のソースの場所を見つけています(デバッグシンボルを含む実行可能ファイルから--compiled with -g
)。当然、引数の 1 つは、検索したい関数へのポインターです。
boolean
_bfd_elf_find_nearest_line (abfd,
section,
symbols,
offset,
filename_ptr,
functionname_ptr, // <- HERE!
line_ptr)
https://sourceware.org/ml/binutils/2000-08/msg00248.html
かなりの量の (純粋な C) ボイラー プレートの後、これが通常の関数 (通常の関数ポインターが にキャストされる*void
) で動作するように管理しました。
たとえば、これは機能します:
int my_function(){return 5;}
int main(){
_bfd_elf_find_nearest_line (...,
(void*)(&my_function),
...);
}
問題はbfd_find_nearest_line
、クラス メンバー関数のソース コードを検索するために使用できるかどうかです。
struct A{
int my_member_function(){return 5.;}
};
_bfd_elf_find_nearest_line (...,
what_should_I_put_here??,
...)
クラス メンバ関数 (この場合は type の場合int (A::*)()
) は関数ではありません。特に、 は関数ポインタにキャストできませんvoid*
。ここを参照してください: https://isocpp.org/wiki/faq/pointers-to-members#cant-cvt-memfnptr-to-voidptr
この背後にあるロジックを完全に理解していますが、メンバー関数ポインターは、BFD に関数を識別させるためにメンバー関数の情報を取得する唯一のハンドルです。このポインターで関数を呼び出したくありません。
私は多かれ少なかれ C++ がどのように機能するかを知っています。コンパイラは同等の free-C 関数を静かに生成します。
__A_my_member_function(A* this){...}
しかし、この無料関数のアドレスにアクセスする方法、またはそれが可能かどうか、ライブラリがこのポインターを介してbfd
元のソースの場所を特定できるかどうかはわかりません。my_member_function
(現時点では、少なくとも私は仮想関数には興味がありません。)
言い換えると、
1)bfd
メンバー関数を見つけることができるかどうかを知る必要があります。
2)そして、可能な場合、型のメンバー関数ポインターを()を取ることができるint (A::*)()
引数にどのようにマップできますか。bfd
void*
ポインターが存在することは他の手段 (スタック トレース) で知ってい_ZN1A18my_member_functionEv
ます&(A::my_member_function)
。