錯誤:
問題解決過程:
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://en.wikipedia.org/wiki/Executable_and_Linkable_Format
https://stackoverflow.com/questions/11748970/how-to-pass-m-elf-i386-to-gcc