zsim的安装
原项目地址https://github.com/s5z/zsim
这个地址对应的zsim在运行时可能会有链接等意想不到的错误,所以如果出错,可以选择使用下面的地址
https://github.com/stanford-mast/zsim
1. 操作系统选择
这个地方非常重要,我最开始用的22.04,但是发现出错了,排查了半天错误,发现是操作系统的问题(zsim是2013年的工作了,太老了),因此需要把操作系统换成14.04
我在我的原系统内装了一个docker,并下载了一个ubuntu-14.04.6-server-amd64.iso的镜像文件(对应的链接),这个镜像文件里没有任何的软件包,需要自己后面下载,在docker里安装自己镜像的操作系统并生成容器这个步骤,可以直接gpt,但是在生成时有一个问题,在运行
./build/opt/zsim tests/simple.cfg
时会报错说
[H] Deadlock detection ON
personality() call failed: Operation not permitted
[H] Panic on build/opt/zsim_harness.cpp:293: Could not change personality to disable address space randomization!
personality() call failed: Operation not permitted
[H] Panic on build/opt/zsim_harness.cpp:293: Could not change personality to disable address space randomization!
这里就需要在创建容器时先设置权限
docker run --privileged -it your_container_image
your_container_image是你的镜像名称
然后进入容器后,运行语句
sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'
2.依赖包安装
根据项目要求,需要安装gcc >=4.6, pin, scons, libconfig, libhdf5, libelfg0
这几个软件包
在安装这几个包之前,需要配好必要的软件包
- 更改/etc/apt/sources.list,否则每次更新都会链接出错,我使用的是阿里源(把原来的内容都删掉,然后换成这个,如果将来想用ubuntu的源,直接从网上搜就行,再换回来)
deb https://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
## Not recommended
# deb https://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
更改之后需要运行sudo apt update来更新软件包列表
2. 更新源
如果直接sudo apt-get install ***
会出现错误(我的是这样的),所以需要运行命令sudo apt-get -f install
,用来修复依赖关系,然后再运行命令sudo apt-get install build-essential
,从而安装好必要的软件包,其中就包括gcc4.8和g++4.8
3. 安装项目依赖
a) 安装pin,这里要安装2.14版本的pin(pin-2.14-71313-gcc.4.4.7-linux.tar),我试了一下3.24、3.13和3.30,都会出现链接的问题
在容器内解压后,需要加一个名为PINPATH的环境变量,即运行命令行
export PINPATH=your_pin_path
your_pin_path是进入你的pin文件夹后的path,可以通过运行命令pwd
获得。直接解压就行,不需要编译和运行
b) 安装scons,直接运行
sudo apt-get install scons
c) 安装libconfig,我这里安装的是1.7.2版本(下载链接)
安装完成后,需要按顺序运行下面代码
./configure
make
make check
make install
然后设置环境变量
export LIBCONFIGPATH=your_libconfig_path
注意:当使用上面方法安装完,再运行zsim时如果报错,可以直接用sudo apt-get install 安装,此时就需要将这个环境变量删除
sudo apt-get install libconfig-dev libconfig++-dev
d) 安装libhdf5(下载链接)
解压完成后就行,不需要编译和运行,同样需要设置环境变量
export HDF5PATH=your_hdf5_path
e) 安装libelfg0,直接sudo apt-get install libelfg0
3. 运行zsim
进入zsim文件夹,然后运行scons -j16
然后再运行./build/opt/zsim tests/simple.cfg
当运行第二条命令时,可能会报错
root@cf70582d16a9:/home/zsim# ./build/opt/zsim tests/simple.cfg
[H] Starting zsim, built Tue Jul 23 05:52:57 UTC 2024 (rev master:113:2aea90e:clean)
[H] Creating global segment, 1024 MBs
[H] Global segment shmid = 0
[H] Deadlock detection ON
E: 5.15 is not a supported linux release
[H] Child 36350 done
E: 5.15 is not a supported linux release
[H] Child 36351 done
[H] All children done, exiting
因此需要对zsim/src里的pin_cmd.cpp进行改动,具体改动步骤看这里
即,在第52行加上
args.push_back("-injection");
args.push_back("child");
然后可能还会报错
A: Source/pin/injector_nonmac/auxvector.cpp: CopyAux: 291: unexpected AUX VEC type 51
################################################################################
## STACK TRACE
################################################################################
addr2line -C -f -e "/home/env_lab/pin-2.14-71313-gcc.4.4.7-linux/intel64/bin/pinbin" 0x5555555c07f9 0x5555555c15ce 0x5555555c18a0 0x5555557e3b3c 0x5555557e92ff 0x5555557eae2d 0x5555557dafe1 0x5555557dfb2d 0x5555557d022e 0x5555557da230 0x7ffff700ef45 0x5555555b517a
??
??:0
??
??:0
??:0
需要再在相同的位置处加
args.push_back("-ifeellucky");
然后再运行,成功!
注意:当在运行scons -j16后,出现有关libconfig的报错时,可以通过删除zsim文件夹下的.sconsign.dblite来解决,直接运行命令rm .sconsign.dblite
然后再重新运行scons -j16
总结
- 看别人的解释和解决方法一定要看仔细
- 用好chatgpt,有好多次解决方法,从网上搜搜不到,或者很复杂,但是问chatgpt就能很快解决,不得不说,chatgpt的功力还是很高的