【发布时间】:2019-06-27 01:35:21
【问题描述】:
我正在阅读这本关于学习 Linux 二进制分析的书。在书中作者介绍了他在他的 github 上的 ftrace,并演示了如何使用它。他提供了一小段代码来测试 ftrace。
在其上运行 ftrace 时,没有任何反应。如果我自己运行可执行文件,我只会遇到段错误。 我正在编译它: gcc -nostdlib test.c -o test
这是我的代码:
int foo(void) {
}
_start()
{
foo();
__asm__("leave");
}
预期结果展示了 ftrace 跟踪函数调用到执行的过程。
这是我要说的文字中的图片:
这是我正在使用的 ftrace:
https://github.com/elfmaster/ftrace
我想问题是,我是否完全遗漏了什么,做错了什么,文本是否过时或者正确的方法是什么?如果这是一个愚蠢的问题,我很抱歉,我只是离开了文字。我还在虚拟机上使用 32 位发行版进行了尝试,但没有任何改变,但只是尝试了一下,因为作者的一些示例是在 32 位上的。谢谢。
注意:当我使用不会导致段错误的程序运行他的 ftrace 时,我得到了
pid_read() failed: Input/output error <0x1>
【问题讨论】:
-
我也在虚拟机上尝试了 32 位发行版。 你永远不需要它,只需在 gcc 命令行中添加
-m32即可制作 32 位代码 /可执行文件。 (所有现代发行版都有用于 gcc/libc 的 multilib 包,用于安装 32 位版本的 libc 和 32 位可执行文件在普通 64 位系统上所需的其他关键库。) -
@PeterCordes 哦,好的,太棒了,谢谢。从现在开始我会这样做。
-
IIRC,_start 函数不应该返回(堆栈上不再有返回地址)。它应该显式调用退出系统调用。此外,
leave将更改为rsp。你为什么要插入leave? -
@AjayBrahmakshatriya 我打算离开书中的例子,我认为休假导致了段错误。但就像我说的那样,我问的是文本中的方法是否已经过时。由于作者展示了他的 ftrace 与小程序一起工作。
-
还有一个有趣的事实:
gcc -nostdlib使静态可执行文件。即使您没有 安装了 32 位库,这也将起作用。您所需要的只是对 32 位进程和系统调用的内核支持。 (在 Windows WSL 上缺失,否则很普遍。)当然,您需要一个包含有用机器代码的 32 位可执行文件。
标签: c gcc x86 inline-assembly ftrace