一
nasm -f elf name.asm
ld -m elf_i386 -o name name.o -Ttext 0x1000
gdb name
二
nasm -f elf64 name.asm
ld -o name name.o -Ttext 0x1000
gdb name
三
nasm -f elf64 name.asm -g -F stabs
gcc -o name name.o -g
gdb name
昨天剛接觸nasm,按網上的資料,編譯、連接配接和調試代碼用的是第一種方式(因為系統是x86_64架構的)。後來又看了nasm和ld指令的參數描述,改用第二種方式,編譯時直接生成elf64格式的object檔案。
可用gdb斷點調試時發現沒有符号表(No symbol table is loaded),仔細看時,才發現剛運作gdb時已經有提示了(Reading symbols from /home/wmy/桌面/t...(no debugging symbols found)...done.)。查閱資料發現:nasm好像确實不能像gas 那樣,在生成的目标代碼中包含符号表(gas加上參數--gstabs,同時ld不使用參數 -s 就行了)。
又在網上查閱各種關于調試nasm的資料,終于發現了上面的第三種方式,不過之前用ld連接配接時,指定入口函數的格式如下:
global _start
_start:
……
……
否則,提示錯誤 “cannot find entry symbol _start”(真有一種java中找不到或無法加載主類的感覺),而這樣的代碼用gcc編譯,又會出現“對‘main’未定義的引用” 的錯誤提示。是以,此時又要将 _start 修改成main。這樣用gdb調試時就有符号表了(Reading symbols from /home/wmy/桌面/t...done)。