是否有load命令的替代方法来导入二进制Tcl包

是否有load命令的替代方法来导入二进制Tcl包,tcl,shared-libraries,tclsh,Tcl,Shared Libraries,Tclsh,我正在使用一个与自制tclsh(Synopsys EDA)接口的商业工具 在他们的版本中,他们删除了load命令。因此,我不能使用第三方库(在我的例子中是Graphviz库) 我想知道是否有其他方法可以导入二进制文件(.so文件)标准Tcl中唯一引入动态库的命令是load。(好的,package require也可以,但那是因为它可以在内部调用load。)没有该命令,您只能选择静态链接自己的代码并在Tcl\u AppInit函数中创建命令,但是,如果您已经在使用其他人的代码,而这些代码已经完成了

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

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


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

标准Tcl中唯一引入动态库的命令是
load
。(好的,
package require
也可以,但那是因为它可以在内部调用
load
。)没有该命令,您只能选择静态链接自己的代码并在
Tcl\u AppInit
函数中创建命令,但是,如果您已经在使用其他人的代码,而这些代码已经完成了类似的工作,那么这就不太可能起作用


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

您所说的“删除
load
命令”是什么意思?他们是否删除了(
rename::load”“
)是从解释器中获取的还是基于配置了
--disable load
autoconf标志的Tcl库?您所说的“Graphviz库”是什么意思??那么,你想做
package req tcldot
?我不知道这一点,但我猜他们在构建shell时禁用了它。我天真地做了
rename::load load
,它返回给我命令
::load
不存在,这就是我想要使用的tcldot,但当我做
package require tcldot
,它就不存在了为关联的
pkgIndex.tcl
中使用的
load
引发未知命令错误。在该命令中,我们可以找到
ifneedtcldot“load[file join$dir Tcldot.so]Tcldot”
2)是否可以运行:
interp create slave;slave eval{::load}
?如果有一个漏洞可以让你做你想做的事情,那么它将是特定于应用程序的(因为safe interp允许控制应用程序创建这样的漏洞,即使它们不是自己创建的;就像操作系统可以对硬件做用户程序做不到的事情一样)。这意味着您需要非常仔细地阅读EDA文档摘要。只是出于好奇,如果我的机器上运行了一个进程,有没有办法加载我自己的库(通过调试该进程,将我的包注入其中,并使用我不知怎么发现的Interp*调用MyPkg_Init?)您可以将包加载到当前解释器以外的解释器中。(这是
load
的可选参数之一),但是没有一种方法可以指示标准tclsh执行加载它正在运行的脚本中不允许的任何操作。如果该脚本使用
comm
dde
(或在Tk中启用了
send
)让您与具有
load
访问权限的主解释器对话,您可以轻松地执行您想要的操作。否则……我想您可以使用C调试器调用
Tcl\u Eval
?(
Tcl_FSLoadFile
存在,但没有从调试器使用的令人愉快的API。)