解决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
正常运行,至此,问题解决。