gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:45:46 25 4
gpt4 key购买 nike

我正在编写一个类似于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com