我正在使用该函数bfd_find_nearest_line
来查找函数的源位置(来自带有调试符号的可执行文件 --compiled with -g
)。自然,其中一个参数是指向我要定位的函数的指针:
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*
)的参数。
我通过其他方式(堆栈跟踪)知道指针存在,例如我可以得到在这种情况下调用了 free 函数_ZN1A18my_member_functionEv
,但问题是我如何从&(A::my_member_function)
.