将.tbc文件转换为.tcl文件

6

这是一个奇怪的问题,我搜索过却找不到令人满意的答案。

我有一个编译好的tcl文件,即一个.tbc文件。那么是否有方法可以将这个.tbc文件转换回.tcl文件呢?

我在这里读到,有人提到了::tcl_traceCompile并表示可以用它来反汇编.tbc文件。但作为一个初学者,我不确定是否可能,或者更确切地说,如何使用它。

虽然我知道tcl编译器并不编译所有语句,所以这些语句可以很容易地在.tbc文件中看到,但我们能否从.tbc文件中获取整个tcl代码呢?

任何评论都将是极好的。


1
你知道使用.tbc格式的整个目的是为了防止转换为可读的.tcl文件。这绝对不是出于性能考虑;实际上,完全不使用.tbc格式更快。(很奇怪,但确实如此!) - Donal Fellows
2个回答

5
不行,或者至少需要花费很多精力才能实现;你正在尝试做一些旨在防止他人窥探商业代码的事情(TBC格式就是为此而设计的)。
TBC文件格式是Tcl字节码的编码形式,通常不保存;TBC代表Tcl ByteCode。 TBC格式数据只由一个工具生成,即商业“Tcl编译器”(最初由Sun或Scriptics编写;该工具的日期大约在转换时期),它确实是利用每个Tcl系统都具有的内置编译器和一些序列化代码的产物。它还尽可能剥离原始源代码。所使用的编码方式不太友好;如果可以的话,应避免编写自己的加载程序,并改用tbcload扩展来完成工作。
您需要使用自定义版本的Tcl,并禁用一些防御性检查,以便可以使用tcl::unsupported::disassemble命令对加载的代码进行反汇编(该命令通常拒绝拆开来自tbcload的任何内容);该命令从Tcl 8.5开始存在。之后,您将不得不从字节码中拼凑出代码正在执行的操作;我不知道有任何工具可以完成这项任务,但是字节码大多数情况下都是相当高级别的,因此对于小片段的代码而言并不太难。 disassemble没有手册页面;毕竟它是正式不支持的!但是,我链接的那个维基页面应该涵盖了大部分您需要开始的东西。

此外,即使启用了tcl_traceCompile功能,也不会有太大帮助,因为代码已经编译完成,并且即使启用该功能,也有检查措施防止揭示TBC定义代码的内容。(tcl_traceExec略微相关,但实际上也没有更有用。) - Donal Fellows

0

我可以部分地回答“是”,但也有条件。这个条件是,如果原始的tcl代码是在命名空间中编写的,并且procs在命名空间花括号内定义。然后你在tkcon/wish中使用info procs和namespace命令查看代码时,你需要源tbc文件。当然,你需要知道命名空间的名称。不过,这也可以找到。


https://dev59.com/N2TWa4cB1Zd3GeqPDXS0 展示了如何列出命名空间。在加载tcb模块之前获取命名空间。加载后再次获取,然后从当前命名空间中过滤出先前的命名空间。然后使用[info commands $namespace]列出可用函数。函数原型不受版权保护。顺便说一下:如果您必须了解源代码正在做什么,我建议使用两人系统。研究一下reactos是如何合法开发的。 - TamusJRoyce

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