8

我正在准备构建 Forth 解释器的整体知识,并想反汇编一些通用的 Forth 代码词,例如+, -,*等。

see我的 Gforth(我目前有 0.7.3 版,安装在 Ubuntu Linux 上)将允许我反汇编我使用 command以及单个代码 word所做的冒号定义.。但是当我尝试使用其他代码字时,see +或者see /,我得到一个错误,说,,Code +然后我不能再输入我的终端,即使我按下 control-c。

我应该能够反编译/反汇编代码字,如 Gforth 手册所示:https ://www.complang.tuwien.ac.at/forth/gforth/Docs-html/Decompilation-Tutorial.html

有没有其他人遇到过这个问题,您知道如何解决吗?

4

4 回答 4

7

恢复到旧的 ptrace 方法对我有用。

首先,从命令行以root用户身份运行:

echo 0 >/proc/sys/kernel/yama/ptrace_scope

之后see应该反汇编它无法反编译的任何东西。命令行示例(不必是root):

gforth -e "see +  bye"

输出:

Code +  
   0x000055a9bf6dad66 <gforth_engine+2454>: mov    %r14,0x21abf3(%rip)        # 0x55a9bf8f5960 <saved_ip>
   0x000055a9bf6dad6d <gforth_engine+2461>: lea    0x8(%r13),%rax
   0x000055a9bf6dad71 <gforth_engine+2465>: mov    0x0(%r13),%rdx
   0x000055a9bf6dad75 <gforth_engine+2469>: add    $0x8,%r14
   0x000055a9bf6dad79 <gforth_engine+2473>: add    %rdx,(%rax)
   0x000055a9bf6dad7c <gforth_engine+2476>: mov    %rax,%r13
   0x000055a9bf6dad7f <gforth_engine+2479>: mov    -0x8(%r14),%rcx
   0x000055a9bf6dad83 <gforth_engine+2483>: jmpq   *%rcx
end-code

学分:安东·厄特尔

于 2017-09-10T19:03:20.403 回答
1

我见过的大多数版本的 SEE 仅用于反编译冒号定义。+ 和 / 和其他算术运算通常用汇编代码编写,SEE 不知道如何处理它们。这就是您收到 CODE 错误消息的原因:它们是用代码编写的,而不是 Forth。我见过几个内置汇编器的 Forth 实现,但我认为我从未见过反汇编器。查看 + 或 / 或其他此类单词的内部工作的最佳选择可能是使用 DUMP 或其他此类单词来获取单词中的字节列表,然后手动反汇编单词或将数据输入外部反汇编程序. 或者看看你是否可以找到你的实现或类似的源代码。

于 2019-01-28T03:02:30.823 回答
0

SEE 是一个没有严格控制行为的词。如果调用为

见 X

根据执行此操作的难度,它的行为略有不同。如果您在会话中自己定义了这个词,那么您几乎可以保证找回您的代码。如果它是一个内置词,特别是如果它是一个非常基本的词,比如+,那就更难了。由于优化或编译成机器代码,它可能看起来与原始定义完全不同。

特别是对于 gforth,如果遇到困难,gforth 会调用系统上存在的标准工具来分析目标文件。所以可能有必要安装 gdb 和/或调查 gforth 如何尝试连接它。对于 Ubuntu 和 gforth 0.7.3 的具体示例,Lutz Mueller 给出了一个配方。

.

于 2018-12-17T15:25:21.707 回答
0

我认为 SEE 按设计完成了它的工作。FORTH 中有一些词在机器代码中定义(通常称为原语),也有可能由用户通过汇编程序定义机器代码,即: : MYCODE assembler memonics ;CODE

所以 SEE 的输出显示不是代码错误,而是(即)+ 字被定义为机器码,并且可以在其输出的右侧看到反汇编的助记符。

于 2021-04-05T08:52:34.350 回答