使用“see”指令对Forth代码单词进行反汇编

9

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

我的 Gforth(我目前安装在 Ubuntu Linux 上的版本为 0.7.3)将允许我使用命令 see 来分解我定义的冒号定义,以及单个代码词 .。但是当我尝试使用其他代码词,例如 see +see / 时,我会收到一个错误消息,显示 Code +,此时即使我按下 control-c,也无法在终端中输入任何内容了。

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

是否有其他人遇到过此问题,并知道如何解决?


2
我在Windows上进行了检查。see +显示了该单词的行Code +,然后是其反汇编。GForth 0.7.0在Windows上。我猜测在Ubuntu上GForth 0.7.3的反汇编器中存在一个错误。 - Rudy Velthuis
2
最后一条评论:当我使用 sudo gforth 启动 gforth 时,它终于在 Ubuntu 上运行了。我通常不建议这样做,但似乎 gforth 使用 gdb 进行反汇编,如果不使用 sudo 启动,则 gdb 不会启动或等待权限等问题。嗯... - Rudy Velthuis
1
@Marcel:虽然这是真的,但这仍意味着see不能正常工作。 - Rudy Velthuis
@PhilKrylov,请提供更多关于在这个上下文中“git HEAD”是什么的细节。也就是说,未来几年读者可能需要知道什么才能看到你引用的相同代码。 - agc
很遗憾,Stack Overflow禁止插入lmgtfy.com链接。无论如何,这个帖子不是关于_git HEAD_的含义。 - Phil Krylov
显示剩余9条评论
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

Credit: Anton Ertl


1
我曾经看到的大多数SEE版本仅用于反编译冒号定义。加号,除号和其他算术操作通常用汇编代码编写,并且SEE不知道该怎么处理它们。这就是为什么您收到CODE错误消息的原因:它们是以代码形式编写的,而不是Forth语言。我看过几个Forth实现,其中一些内置有汇编程序,但我认为我从未见过反汇编器。想要查看+或/等单词的内部工作原理的最佳方法可能是使用DUMP或另一个类似的单词获取该单词中的字节列表,然后手动反汇编该单词或将数据馈入外部反汇编器。或查找您的实现或类似实现的源代码。

0

SEE是一个行为不太受控制的单词。如果以以下方式调用:

SEE X

它会尽力显示单词X的代码,并根据难度略有不同。如果您在会话中自己定义了该单词,则几乎可以保证获得您的代码。如果它是内置单词,特别是像+这样非常基本的单词,那么就更难了。由于优化或编译成机器代码,它可能看起来与原始定义完全不同。

对于gforth而言,如果变得困难,gforth会调用系统上存在的标准工具来分析目标文件。因此,可能需要安装gdb和/或调查gforth如何尝试连接到它。对于Ubuntu和gforth 0.7.3的具体示例,Lutz Mueller提供了一份配方。

.


0

我认为SEE按设计的方式完成了它的工作。 在FORTH中有用机器码定义的单词(通常称为原语),用户还可以通过汇编器定义机器码,例如: :MYCODE assembler memonics; CODE

因此,SEE的输出显示不是代码错误,而是(例如)+字被定义为机器码,用户可以在其输出右侧看到反汇编的助记符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接