CSAPP2e Y86模拟器GUI模式启动报错:无法读取seq.tcl文件
问题:CSAPP2e Y86模拟器GUI模式启动报错"couldn't read file 'seq.tcl'"
启动CSAPP2e中Y86模拟器的GUI模式时触发报错:
Error in startup script: couldn't read file "seq.tcl": no such file or directory
但./sim/seq/目录下确实存在seq.tcl文件,且TTY模式运行正常。
环境与操作细节
- 源码为CSAPP2e官方模拟器包,仅取消编译配置中三个GUI相关选项的注释,配置如下:
GUIMODE=-DHAS_GUI TKLIBS=-L/usr/lib -ltk -ltcl TKINC=-isystem /usr/include
- 在
y86-code目录执行启动命令:
../seq/ssim -g asum.yo
- 系统版本:
CentOS Linux release 7.9.2009 x86_64 - 编译过程无报错,完整编译信息如下:
(cd misc; make all) make[1]: Entering directory `/root/code/sim/misc' gcc -Wall -O2 -c yis.c gcc -Wall -O2 -c isa.c gcc -Wall -O2 yis.o isa.o -o yis gcc -Wall -O2 -c yas.c gcc -O2 -c yas-grammar.c gcc -Wall -O2 yas-grammar.o yas.o isa.o -lfl -o yas bison -d hcl.y flex hcl.lex gcc -O2 node.c lex.yy.c hcl.tab.c outgen.c -o hcl2c make[1]: Leaving directory `/root/code/sim/misc' (cd pipe; make all GUIMODE=-DHAS_GUI TKLIBS="-L/usr/lib -ltk -ltcl" TKINC="-isystem /usr/include") make[1]: Entering directory `/root/code/sim/pipe' # Building the pipe-std.hcl version of PIPE ../misc/hcl2c -n pipe-std.hcl < pipe-std.hcl > pipe-std.c gcc -Wall -O2 -isystem /usr/include -I../misc -DHAS_GUI -o psim psim.c pipe-std.c \ ../misc/isa.c -L/usr/lib -ltk -ltcl -lm ./gen-driver.pl -n 4 -f ncopy.ys > sdriver.ys ../misc/yas sdriver.ys ./gen-driver.pl -n 63 -f ncopy.ys > ldriver.ys ../misc/yas ldriver.ys make[1]: Leaving directory `/root/code/sim/pipe' (cd seq; make all GUIMODE=-DHAS_GUI TKLIBS="-L/usr/lib -ltk -ltcl" TKINC="-isystem /usr/include") make[1]: Entering directory `/root/code/sim/seq' # Building the seq-std.hcl version of SEQ ../misc/hcl2c -n seq-std.hcl <seq-std.hcl >seq-std.c gcc -Wall -O2 -isystem /usr/include -I../misc -DHAS_GUI -o ssim \ seq-std.c ssim.c ../misc/isa.c -L/usr/lib -ltk -ltcl -lm make[1]: Leaving directory `/root/code/sim/seq' (cd y86-code; make all) make[1]: Entering directory `/root/code/sim/y86-code' ../misc/yas abs-asum-cmov.ys ../misc/yas abs-asum-jmp.ys ../misc/yas asum.ys ../misc/yas asumr.ys ../misc/yas asumi.ys ../misc/yas asuml.ys ../misc/yas cjr.ys ../misc/yas j-cc.ys ../misc/yas poptest.ys ../misc/yas pushquestion.ys ../misc/yas pushtest.ys ../misc/yas prog1.ys ../misc/yas prog2.ys ../misc/yas prog3.ys ../misc/yas prog4.ys ../misc/yas prog5.ys ../misc/yas prog6.ys ../misc/yas prog7.ys ../misc/yas prog8.ys ../misc/yas prog9.ys ../misc/yas prog10.ys ../misc/yas ret-hazard.ys make[1]: Leaving directory `/root/code/sim/y86-code'
解决方案
问题核心是Tcl/Tk加载脚本时依赖当前工作目录,在y86-code目录启动ssim时,程序会在当前目录寻找seq.tcl,而非ssim所在的seq目录。以下是三种解决方式:
方法1:切换到seq目录启动
进入sim/seq目录,指定y86文件的相对路径:
cd /root/code/sim/seq ./ssim -g ../y86-code/asum.yo
方法2:修改ssim的脚本加载路径
修改sim/seq/ssim.c中加载seq.tcl的代码,指定绝对路径:
- 打开
sim/seq/ssim.c,找到类似如下的代码段:
Tcl_Eval(tcl, "source seq.tcl");
- 修改为绝对路径:
Tcl_Eval(tcl, "source /root/code/sim/seq/seq.tcl");
- 重新编译:
cd /root/code/sim/seq make clean && make all GUIMODE=-DHAS_GUI TKLIBS="-L/usr/lib -ltk -ltcl" TKINC="-isystem /usr/include"
方法3:设置TCL_LIBRARY环境变量
临时指定Tcl脚本搜索路径,将seq目录加入:
cd /root/code/sim/y86-code export TCL_LIBRARY=/root/code/sim/seq ../seq/ssim -g asum.yo
如需永久生效,可将export TCL_LIBRARY=/root/code/sim/seq添加至~/.bashrc或/etc/profile文件中。
内容的提问来源于stack exchange,提问作者Nicholas
相关产品推荐
相关产品推荐

