解決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正常運行,至此,問題解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM