我正在准备关于构建Forth解释器的整体知识,并想要反汇编一些通用的Forth代码字,如+,-,*等。
我的Gforth (我目前在Ubuntu Linux上安装了0.7.3版本)将允许我反汇编我用命令see和单个代码字.创建的冒号定义。但当我尝试使用其他代码字,see +或see /时,我得到一个错误,显示为Code +,然后我无法再在终端中键入,即使我按下c c。
我应该能够反编译/反汇编代码字,如Gforth手册所示:https://www.complang.tuwien.ac.at/forth/gforth/Docs-html/Decompilation-Tutorial.html
其他人也遇到过这个问题吗?你知道如何解决它吗?
发布于 2017-09-11 03:03:20
恢复到the old ptrace method为我做到了。
首先,以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来源: Anton Ertl
发布于 2019-01-28 11:02:31
我见过的大多数SEE版本都只用于反编译冒号定义。+和/和其他算术运算通常是用汇编代码编写的,SEE不知道如何处理它们。这就是为什么您会收到代码错误消息:它们是用代码编写的,而不是Forth。我见过有几个Forth实现内置了汇编程序,但我想我从来没有见过反汇编程序。要了解+或/或其他类似单词的内部工作原理,最好的方法可能是使用DUMP或其他此类单词来获取单词中的字节列表,并手动反汇编单词或将数据提供给外部反汇编程序。或者看看你是否能找到你的实现或类似的源代码。
发布于 2018-12-17 23:25:22
SEE是一个没有严格控制行为的词。这是一种最大的努力来显示一个单词X的代码,如果调用
请参见X
根据执行此操作的难度,它的行为略有不同。如果你在会话中自己定义了这个词,你就很有可能拿回你的代码。如果它是一个内置的单词,特别是如果它是一个像+这样非常基本的单词,它就会更难。由于优化或编译成机器代码,它可能看起来与原始定义一点也不像。
具体地说,对于gforth,如果遇到困难,gforth会调用系统上存在的标准工具来分析目标文件。因此,可能有必要安装gdb和/或调查gforth是如何连接到它的。对于Ubuntu和Gfort0.7.3的具体示例,Lutz Mueller给出了一个recipee。
。
https://stackoverflow.com/questions/44014281
复制相似问题