【问题标题】:.tbc to .tcl file.tbc 到 .tcl 文件
【发布时间】:2013-01-31 18:58:09
【问题描述】:

这是一个奇怪的问题,我搜索了但找不到任何令人满意的答案。

我有一个已编译的 tcl 文件,即一个 .tbc 文件。那么有没有办法将这个.tbc 文件转换回.tcl 文件。

我阅读了here,有人提到了::tcl_traceCompile,并说这可以用来反汇编.tbc 文件。但是作为一个新手 tcl 用户,我不确定这是否可能,或者说更多,如何准确地使用它。

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

任何评论都会很棒。

【问题讨论】:

  • 您知道使用 .tbc 格式的全部意义是停止转换为可读的 .tcl 文件。这当然不是为了性能。根本不使用 .tbc 格式实际上更快。 (奇怪,但真实!)

标签: tcl


【解决方案1】:

不,或者至少在没有大量工作的情况下不会;您正在做一些努力来防止的事情(TBC 格式旨在保护商业代码不被窥探)。


TBC文件格式是Tcl的字节码的一种编码,一般情况下根本不保存; TBC 代表 Tcl ByteCode。 TBC 格式数据仅由一种工具生成,即商业“Tcl 编译器”(最初由 Sun 或 Scriptics 编写;该工具的历史大约是过渡时期),它实际上是利用内置编译器,每个 Tcl 系统都有一些序列化代码。它还尽可能多地剥离原始源代码。使用的编码令人不快;如果可以的话,您希望避免编写自己的加载器,而是使用 tbcload 扩展来完成这项工作。

然后,您需要将它与禁用一些防御性检查的自定义 Tcl 构建一起使用,以便您可以使用 tcl::unsupported::disassemble 命令(通常拒绝分解来自 tbcload 的任何内容)来反汇编加载的代码);该命令从 Tcl 8.5 开始存在。之后,您必须从字节码中拼凑出代码在做什么;我根本不知道有什么工具可以做到这一点,但字节码大多是相当高级的,所以对于小段代码来说并不是困难。

disassemble 没有手册页;毕竟它是正式不受支持的!但是,我链接到的那个 wiki 页面应该涵盖了您需要开始的大部分内容。

【讨论】:

  • 另外,tcl_traceCompile 不会有太大帮助,因为代码已经编译,并且即使启用该功能以防止泄露内容,也会进行检查TBC 定义的代码。 (tcl_traceExec 更相关,但实际上并没有更多用处。)
【解决方案2】:

我可以部分说“是”,也可以有条件地说。该条件是如果原始 tcl 代码是在命名空间中编写的,并且过程是在命名空间花括号中定义的。然后您在 tkcon/wish 中获取 tbc 文件并使用 info procs 和命名空间命令查看代码。当然,您需要知道命名空间名称。不过也可以找到。

【讨论】:

  • stackoverflow.com/questions/10833761/… 展示了如何列出命名空间。在加载 tcb 模块之前获取命名空间。加载后再次获取它们,然后从当前过滤前一个。然后使用 [info commands $namespace] 列出可用的功能。函数原型不受版权保护。 Tangent:如果你必须了解源代码在做什么,我建议使用两人系统。了解 reactos 是如何合法开发的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 2015-05-13
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多