如何确定main的起始地址

时间:2014-01-10 23:13:06

标签: c operating-system stack computer-architecture

我正在编写一个堆栈跟踪程序,类似于gdb中的backtrace

Example Program

void bar(int x, int y){
    trace(stdio);
}

void foo(){
    bar(1, 2);
}


int main(int argc, char*argv[]){
    foo();
}

它会打印出来

Function bar..
Function foo..

问题是我不知道当我到达主要时如何停止。我有一个存储函数起始地址的表,包括main

我的方法是trace函数,我将首先通过编写一个小的汇编代码来阅读ebp。因此我得到return addr trace bar

所以我可以通过在trace中添加offset {由CALL指令确定)到bar的返回地址来获取trace的起始地址(这利用了相对IP)

但是当我到达main时,我不能使用相同的技术,main的返回地址将我带到一些我无法访问的内存区域。

如何确定main函数中的Im? (我希望得到main)的起始地址

1 个答案:

答案 0 :(得分:0)

有很多库可以解决这个问题,即libunwind或libc回溯函数:http://www.gnu.org/software/libc/manual/html_node/Backtraces.html

如果你想自己实现它,你可以解析可执行文件的ELF头。这样您就可以获得函数名称和起始地址/长度。因此,您可以检查您是否已经在名为" main"。

的函数中