解決CMU-15-213-ICS的部分lab在部分64位系統WSL中btest無法運行的問題
錯誤信息
-bash: ./btest: cannot execute binary file: Exec format error
背景
這學期在學ICS課,有部分同學表示用64位系統的WSL make btest
之后./btest
會報出如上的錯誤。
通過搜索引擎搜索,網絡上大部分都將這個原因歸結為系統問題,需要使用32位系統才行。
但是,今宵我初讀CSAPP
(《沒人理解計算機系統》)時,在第3版第27頁
的2.1.2 字數據大小
這節中看到
大多數64位機器也可以運行為32位機器編譯的程序,這是一種向后兼容。因此,舉例來說,當程序prog.c用如下偽指令編譯后
linux > gcc -m32 prog.c
該程序就可以在32位或64位機器上正確運行。另一方面,若程序用下述偽指令編譯
linux > gcc -m64 prog.c
那就只能在64位機器上運行。
這里的“大多數”引起了我的注意,這不就和要解決的問題一樣嗎?
解決方法
找到btest.c
同目錄下的Makefile
文件並編輯為:
#
# Makefile that builds btest and other helper programs for the CS:APP data lab
#
CC = gcc
CFLAGS = -O -Wall -m64 # 只要修改這行,將-m32換成-m64即可
LIBS = -lm
all: btest fshow ishow
btest: btest.c bits.c decl.c tests.c btest.h bits.h
$(CC) $(CFLAGS) $(LIBS) -o btest bits.c btest.c decl.c tests.c
fshow: fshow.c
$(CC) $(CFLAGS) -o fshow fshow.c
ishow: ishow.c
$(CC) $(CFLAGS) -o ishow ishow.c
# Forces a recompile. Used by the driver program.
btestexplicit:
$(CC) $(CFLAGS) $(LIBS) -o btest bits.c btest.c decl.c tests.c
clean:
rm -f *.o btest fshow ishow *~
修改完之后,在WSL中
make clean all
./btest
可以看見btest
正常運行,至此,問題解決。