挖坑:學習筆記(一)講述如何在 Windows Vmware 上安裝 Ubuntu 20.04
實踐環境
本文是基于Ubuntu 20.04平臺進行實驗,下文中的解決方法都基于此前提
問題記錄
問題一
《匯編語言程式設計》第四章的實體程式cpuid2.s在編譯運行的程序中,有如下問題:
$ as -o cpuid2.o cpuid2.s
puid2.s: Assembler messages:
cpuid2.s:17: Error: invalid instruction suffix for `push'
cpuid2.s:18: Error: invalid instruction suffix for `push'
cpuid2.s:21: Error: invalid instruction suffix for `push'
該問題是由于我們當前的處理器一般都是 x86_64 或 IA64,即 64 位處理器,而書中的實體代碼是在 32 位 Intel 處理器上面運行的,問題的解決方法是給as命令傳入一個選項表明我們要編譯 32 位的指令集,即
$ as --32 -o cpuid2.o cpuid2.s
問題二
$ ld -dynamic-linker /lib/ld-linux.so.2 -o cpuid2 cpuid2.o -lc
ld: i386 architecture of input file `cpuid2.o' is incompatible with i386:x86-64 output
該問題的原因是我們編譯出的目標檔案cpuid2.o是 32 為指令集,而動態聯結器/lib/ld-linux.so.2和 C 庫卻是 64 位指令集,該問題的解決方案是我們需要安裝 32 位 C 庫和動態聯結器,然后使用它們編譯生成可執行檔案,即
$ sudo apt-get install lib32z1
$ ld -m elf_i386 -dynamic-linker /lib32/ld-linux.so.2 -o cpuid2 cpuid2.o /lib32/libc.so.6
$ ./cpuid2
The processor Vendor ID is 'GenuineIntel'
問題三
當使用gcc直接編譯時,把_start改成main之后,
$ gcc -o cpuid2 cpuid2.s
puid2.s: Assembler messages:
cpuid2.s:17: Error: invalid instruction suffix for `push'
cpuid2.s:18: Error: invalid instruction suffix for `push'
cpuid2.s:21: Error: invalid instruction suffix for `push'
和前面兩個問題一樣,該問題是因為我們默認編譯 64 位指令集代碼,我們需要指定gcc選項讓它編譯 32 位指令集代碼,即使用-m32選項,但是第一次的話,這里還是存在問題
$ gcc -m32 -o cpuid2 cpuid2.s
/usr/bin/ld: cannot find Scrt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 when searching for libgcc_s.so.1
/usr/bin/ld: cannot find libgcc_s.so.1
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
collect2: error: ld returned 1 exit status
這個問題的原因是我們沒有安裝 GCC 32 位相關的 C 運行時庫等,解決方法為
$ sudo apt-get install gcc-multilib
$ gcc -m32 -o cpuid2 cpuid2.s
$ ./cpuid2
The processor Vendor ID is 'GenuineIntel'
結語
因水平有限,文中對問題根因的理解和對解決方案的描述可能存在錯誤或不準確,僅供大家參考,也歡迎大家批評指正,
參考
因為參考的文章較多,這里不一一列出,感謝分享的人們,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/278731.html
標籤:其他
上一篇:《匯編語言程式設計》(Professional Assembly Language)學習筆記(二)
下一篇:谷歌瀏覽器運行報錯
