c - 如何确定main的起始地址

标签 c operating-system stack cpu-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 时我不知道如何停止。我有一个存储函数起始地址的表,包括 main

我的方法是针对trace函数,我会先通过编写一个小的汇编代码来读取ebp。因此,我得到了 bartracereturn addr

所以我可以通过添加一个偏移量来获取trace的起始地址(由bar中的CALL指令决定) >) 到 trace 的返回地址(这里使用相对 IP)

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

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

最佳答案

有很多可用的库已经解决了这个问题,即 libunwind 或 libc backtrace 函数:http://www.gnu.org/software/libc/manual/html_node/Backtraces.html

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

关于c - 如何确定main的起始地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21056200/

相关文章:

c - 大型头文件 c++ 中字符串常量之前的语法错误

c - ISRS 没有接到电话

c++ - 我可以使用 c/c++ 与硬件设备通信吗?

c - C 段错误中的大型阵列,erathos 的 Sievs

c++ - 如何仅从文件中读取特定字符?

c - 指向 C 中结构的指针

c - pcap_next() 将地址返回到不可访问的内存区域

c - 使用 sscanf 时出现段错误

android - 如何减少在冷启动时启动应用程序所需的时间

java - 使用堆栈实现撤消/重做方法