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”,現在新版本已經不支持了。

 

參考:

https://stackoverflow.com/questions/31369916/unable-to-compile-assembly-usr-bin-ld-i386-architecture-of-input-file-array1?rq=1

https://stackoverflow.com/questions/19200333/architecture-of-i386-input-file-is-incompatible-with-i386x86-64

https://en.wikipedia.org/wiki/Executable_and_Linkable_Format

https://stackoverflow.com/questions/11748970/how-to-pass-m-elf-i386-to-gcc


免責聲明!

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



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