我正在使用函數bfd_find_nearest_line
來查找函數的源位置(從帶有調試符號的可執行文件 - 編譯爲-g
)。自然的論據之一是函數指針我想定位:使BFD庫找到類成員函數的位置
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??,
...)
類的成員函數(在這種情況下,如果類型int (A::*)()
)不是函數,一個特別不能轉換到的任何函數的指針,甚至不void*
。看到這裏:https://isocpp.org/wiki/faq/pointers-to-members#cant-cvt-memfnptr-to-voidptr
我完全理解這個背後的邏輯,成員函數指針是如何從中獲得成員函數信息的唯一句柄,以便使BFD識別函數。我不希望這個指針調用一個函數。
我知道更多或更少的C++如何工作的,編譯器會悄悄地產生相當的自由-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)
得到這個。
謝謝,我試圖避免外部工具。所有的外部工具都使用'bfd'後。 – alfC