我需要可執行文件中的代碼段的位置(開始和結束地址)。我試圖用兩個虛擬功能:獲取可執行文件中的函數位置
void begin_address(){}
void f(){
...
}
void end_address(){}
...
printf("Function length: %td\n", (intptr_t)end_address - (intptr_t)begin_address);
的問題是,當使用-O4
優化與gcc
我得到了一個負長度。看起來這不適用於優化。
我編f
到組裝,並嘗試以下操作:
__asm__(
"func_begin:"
"movq $10, %rax;"
"movq $20, %rbx;"
"addq %rbx, %rax;"
"func_end:"
);
extern unsigned char* func_begin;
extern unsigned char* func_end;
int main(){
printf("Function begin and end address: %p\t%p\n", func_begin, func_end);
printf("Function length: %td\n", (intptr_t)func_end - (intptr_t)func_begin);
}
的問題是,即使沒有優化我收到一些奇怪的輸出:
Function begin and end address: 0x480000000ac0c748 0xf5158b48e5894855
Function length: -5974716185612615411
我怎樣才能得到的位置可執行文件中的函數?我的第二個問題是,是否將此地址稱爲const char*
是否安全。如果有差異,我對32位和64位解決方案感興趣。
在第二個例子中,你想要使用'func_begin'(func_begin的地址)而不是'func_begin'(它的值)。 – immibis
我很驚訝你沒有得到零的第一種方法。 gcc將優化相同的功能來共享一個定義(兩個符號指的是相同的地址)。這兩個函數都是空的,所以應該編譯成一個'ret'。你應該在http://gcc.godbolt.org/上試試看看編譯器是怎麼產生的(使用高亮和格式化)。 –