【问题标题】:Is there an alternative to the load command to import binary Tcl package是否有加载命令的替代方法来导入二进制 Tcl 包
【发布时间】:2018-04-06 12:41:52
【问题描述】:

我正在使用与自制 tclsh(Synopsys EDA) 接口的商业工具。

在他们的版本中,他们删除了load 命令。因此我不能使用第三方库(在我的例子中是 Graphviz 库)。

我想知道是否有另一种方法可以导入二进制文件(.so 文件)

【问题讨论】:

  • “删除了load 命令”是什么意思?他们是从解释器中删除 (rename ::load "") 还是在配置了 --disable-load autoconf 标志的 Tcl 库上构建?
  • “Graphviz 库”是什么意思? Tcldot?所以,你想做package req tcldot
  • 我不知道,但我猜他们在构建 shell 时禁用了它。我天真地做了rename ::load load,它告诉我命令::load 不存在
  • 是的,这是我想要使用的 Tcldot,但是当我使用 package require Tcldot 时,它会为关联的 pkgIndex.tcl 中使用的 load 引发未知命令错误。我们可以在其中找到ifneeded Tcldot " load [file join $dir tcldot.so] Tcldot"
  • 2) 你能跑吗:interp create slave; slave eval {::load}?

标签: tcl shared-libraries tclsh


【解决方案1】:

标准 Tcl 中唯一引入动态库的命令是load。 (好吧,package require 也可以,但那是因为它可以在内部调用 load。)如果没有该命令,您只有 静态 链接您自己的代码并在Tcl_AppInit 函数,但是如果你已经在使用其他人的代码并且已经完成了这种事情,那真的不太可能工作。

最简单的方法可能是通过exec tclsh script.tcl(运行并等待终止)或open |tclsh r+(打开管道)将普通的tclsh 作为子进程运行。如果他们也没有关闭这些功能;你可能在一个安全的解释器中运行,所有这些东西都被系统地禁用了。我不知道有什么方法可以打破标准的安全解释器(为了谨慎起见,将它们锁定错误的机制)所以如果是这样的话,你只需要将你想要的数据保存到一个文件中某处(通过 any 有效的机制;默认情况下,安全解释器也根本无法触及文件系统,尽管通常以受保护的方式对其进行分析)并使用完全独立的程序来处理它。

【讨论】:

  • 如果有一个漏洞可以让你做你想做的事,那么它将是特定于应用程序的(因为安全的解释器允许控制应用程序创建这些漏洞,即使它们没有制造它们他们自己;这就像操作系统如何对硬件做一些用户程序不能做的事情)。这意味着您需要非常仔细地阅读 Synopsis EDA 文档。
  • 只是出于好奇,如果我的机器上正在运行一个进程,有没有办法加载我自己的库(通过调试该进程,将我的包注入其中,并使用 Interp 调用 MyPkg_Init * 我以某种方式发现的?)
  • 您可以将包加载到当前解释器之外的解释器中。 (它是load 的可选参数之一。)但是没有办法指示标准tclsh 加载它正在运行的脚本中不允许的任何内容。如果脚本使用commdde(或在Tk 中启用send)让您与可以访问load 的主解释器交谈,您可以轻松地做您想做的事。否则……我想您可以使用 C 调试器调用Tcl_Eval? (Tcl_FSLoadFile 存在,但没有可从调试器中使用的令人愉快的 API。)
猜你喜欢
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多