最近突然对x86架构感兴趣,在看《操作系统真象还原》这本书,里面用到了bochs,版本为bochs2.6.2,我在用的虚拟机是Ubuntu20.04,为了原汁原味,决定不用最新版的bochs,而是在Ubuntu20.04上安装bochs2.6.2,安装期间遇到并解决了一些编译相关问题,记录在此处,供参考。
-
下载 :
在网站https://bochs.sourceforge.io/上下载bochs 2.6.2,对应文件为bochs-2.6.2.tar.gz。 -
解压 :
$ tar zxvf bochs-2.6.2.tar.gz
- 配置 :
./configure --prefix=/yourdir/bochs_2_6_2 --enable-debugger --enable-disasm --enable-iodebug --enable-x86-debugger --with-x --with-x11
- make
make失败,报错信息:
g++ -c -I.. -I./.. -I../iodev -I./../iodev -I../instrument/stubs -I./../instrument/stubs -g -O2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES gtk_enh_dbg_osdep.cc -o gtk_enh_dbg_osdep.o
gtk_enh_dbg_osdep.cc:20:10: fatal error: gtk/gtk.h: 没有那个文件或目录
20 | #include <gtk/gtk.h>
| ^~~~~~~~~~~
compilation terminated.
这样的报错说明需要gtk。(后来发现是gtk+2.0)
- 安装gtk+2.0
$ sudo apt-get update
$ sudo apt-get install gtk+-2.0
安装完毕后,重新make,仍然报同样的错误,说明需要手动配置gtk的头文件和库路径。
- 安装pkg-config
$ sudo apt-get install pkg-config
- 手动修改bochs/目录下的Makefile
原Makefile内容如下
SHELL = /bin/bash
CC = gcc
CXX = g++
CFLAGS = -g -O2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES $(X_CFLAGS) $(MCH_CFLAGS) $(FLA_FLAGS) -DBX_SHARE_PATH='"$(sharedir)"'
CXXFLAGS = -g -O2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES $(X_CFLAGS) $(MCH_CFLAGS) $(FLA_FLAGS) -DBX_SHARE_PATH='"$(sharedir)"'
LDFLAGS =
LIBS = -lm
修改后Makefile内容如下
SHELL = /bin/bash
# 此处添加了两个变量,分别是库相关选项和头文件相关选项,后面引用不赘述
LIBS_GTK_2_0 = $(shell pkg-config --libs gtk+-2.0)
CFLAGS_GTK_2_0 = $(shell pkg-config --cflags gtk+-2.0)
CC = gcc
CXX = g++
CFLAGS = -g -O2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES $(X_CFLAGS) $(MCH_CFLAGS) $(FLA_FLAGS) -DBX_SHARE_PATH='"$(sharedir)"' $(CFLAGS_GTK_2_0)
CXXFLAGS = -g -O2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES $(X_CFLAGS) $(MCH_CFLAGS) $(FLA_FLAGS) -DBX_SHARE_PATH='"$(sharedir)"' $(CFLAGS_GTK_2_0)
LDFLAGS =
# 此处新增了"-lpthread -lX11"两个选项,缺少这两个选项对应的编译错误不赘述
LIBS = -lm $(LIBS_GTK_2_0) -lpthread -lX11
-
重新make成功
-
安装到指定路径,完毕
make install