解决CMU-15-213-ICS的部分lab在部分64位系统WSL中btest无法运行的问题

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

posted @ 2020-10-14 23:14  wr786  阅读(818)  评论(1编辑  收藏  举报