天天看點

linux下使用gdb調試nasm程式

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)。

繼續閱讀