2021-05-12 14:32:11
Ubuntu 16.04使用NASM編譯時用ld連結程式出現:i386 架構於輸入檔案 sandbox.o 與 i386:x86-64 輸出不相容
Ubuntu 16.04使用NASM編譯時用ld連結程式出現:i386 架構於輸入檔案 sandbox.o 與 i386:x86-64 輸出不相容(I386 architecture in the input file sandbox.o is not compatible with i386: x86-64 output)
錯誤:
問題解決過程:
1、先確定CPU的架構
2、這是以64位元架構的CPU,如果使用elf引數時,預設是以32位元模式去處理,那麼此時需要更精確的去指定這個模式,比如elf32(32位元),elf64(64位元),具體的參考:http://www.nasm.us/doc/nasmdoc7.html
那麼改寫上面的寫法可以為:
nasm -f elf64 -g -F stabs sandbox.asm -o sandbox.o
ld -o sandbox sandbox.o
3、如果想編譯程32位元和64位元的組合,那麼可以從連結入手,寫法可以改為:
nasm -f elf -g -F stabs sandbox.asm -o sandbox.o
ld -m elf_i386 -o sandbox sandbox.o
其實這裡說法應該是不對的,不能說是組合,而是應該說是連結生成相容32位元模式的應用程式才對。
因為從上面可以看書,elf預設是32為,而elf_i386也為32位元,其中elf_x86_64才是64位元。所以,應該相容才對。
也許上面說法也是不專業,或者這樣說:nasm編譯出來是32位元的,而連結程式ld將32位元的應用程式連結到了64位元上做為可執行檔案,這樣做是不對的,應該將32位元應用程式連結到32位元上做為可執行檔案。
所以,我覺得應該不是與CPU架構有關,而是應該與作業系統有關,作業系統區分32位元和64位元,而很多的組合例子還是停留在32位元x86上,造成以上的問題出現。
還有一點,使用ld時,有些書本上會這樣寫“ld -m elf_i386 -o sandbox.o sandbox”,現在新版本已經不支援了。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-08/146065.htm
相關文章