2011-11-13 44 views
2

我想從我正在閱讀的程序集書中找到一個簡單的示例。我正試圖讓gdb與我正在與NASM彙編程序彙編的簡單彙編程序一起工作。以下是代碼,以及elf格式的對象文件。NASM和GDB符號:「在符號文件中找不到任何代碼段」。

; Version   : 1.0 
; Created Date : 11/12/2011 
; Last Update  : 11/12/2011 
; Author   : Jeff Duntemann 
; Description  : A simple assembly app for Linux, using NASM 2.05, 
;     demonstrating the use of Linux INT 80H syscalls 
;     to display text. 
; Build using these commands: 
; nasm -f elf -g -F stabs eatsyscall.asm 
; ld -o eatsyscall eatsyscall.o 
; 

SECTION .data     ; Section containing initialized data 
EatMsg: db "Eat at Joe's!",10 
EatLen: equ $-EatMsg 

SECTION .bss      ; Section containing uninitialized data 

SECTION .txt      ; Section containing code 


global _start     ; Linker needs this to find the entry point! 

_start: 
    nop       ; This no_op keeps gdb happy (see text) 
    mov eax,4     ; Specify sys_write syscall 
    mov ebx,1     ; Specify File Descriptor 1: Standard Output 
    mov ecx,EatMsg    ; Pass offset of the message 
    mov edx,EatLen    ; Pass the length of the mesage 
    int 80H      ; Make syscall to output the text to stdout 

    mov eax,1     ; Specify Exit syscall 
    mov ebx,0     ; Return a code of zero 
    int 80H      ; Make syscall to terminate the program 

[email protected]:~/Code/AsmWork/eatsyscall$ objdump -s ./eatsyscall.o 

./eatsyscall.o:  file format elf32-i386 

Contents of section .data: 
0000 45617420 6174204a 6f652773 210a  Eat at Joe's!. 
Contents of section .txt: 
0000 90b80400 0000bb01 000000b9 00000000 ................ 
0010 ba0e0000 00cd80b8 01000000 bb000000 ................ 
0020 00cd80        ...    
Contents of section .stab: 
0000 00000000 64000100 00000000   ....d.......  
Contents of section .stabstr: 
0000 00 

我使用下面的命令來組裝:

nasm -f elf -g -F stabs eatsyscall.asm 

,我使用下面的命令鏈接:

ld -o eatsyscall eatsyscall.o 

當我在我得到的可執行文件上運行GDB以下:

[email protected]:~/Code/AsmWork/eatsyscall$ gdb eatsyscall 
GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08 
Copyright (C) 2011 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "i686-linux-gnu". 
For bug reporting instructions, please see: 
<http://bugs.launchpad.net/gdb-linaro/>... 
Reading symbols from /home/mehoggan/Code/AsmWork/eatsyscall/eatsyscall...Can't find any code sections in symbol file 
(gdb) quit 

我需要什麼,除了我所完成以上工作得到GDB讀取指定NASM用-g標誌將調試符號呢?

FYI

[email protected]:~/Code/AsmWork/eatsyscall$ cat /etc/*release* 
DISTRIB_ID=Ubuntu 
DISTRIB_RELEASE=11.10 
DISTRIB_CODENAME=oneiric 
DISTRIB_DESCRIPTION="Ubuntu 11.10" 
[email protected]:~/Code/AsmWork/eatsyscall$ uname -a 
Linux mehoggan 3.0.0-12-generic-pae #20-Ubuntu SMP Fri Oct 7 16:37:17 UTC 2011 i686 i686 i386 GNU/Linux 
[email protected]:~/Code/AsmWork/eatsyscall$ 

--Update--

即使我走了64位路由使用下面的命令,我仍然沒有成功:

mehoggan @ mehoggan :〜/ Code/AsmWork/eatsyscall $ nasm -f elf64 -g -F stabs eatsyscall.asm mehoggan @ mehoggan:〜/ Code/AsmWork/eatsyscall $ ld -o eatsyscall eatsyscall.o -melf_x86_64 mehoggan @ mehoggan:〜/代碼/ AsmWork/eatsyscall $ ./eatsyscall 慶典:./eatsyscall:不能執行二進制文件 mehoggan @ mehoggan:〜/代碼/ AsmWork/eatsyscall $ objdump的-s eatsyscall.o

eatsyscall.o:文件格式elf64-x86-64

部分內容.data: 0000 45617420 6174204a 6f652773 210a在Joe's吃過!
section .txt的內容: 0000 9048b804 00000000 00000048 bb010000 .H ......... H .... 0010 00000000 0048b900 00000000 00000048 ..... H ........ H 0020 ba0e0000 00000000 00cd8048 b8010000 ............ H .... 0030 00000000 0048bb00 00000000 000000cd ..... H .......... 0040 80。
section .stab的內容: 0000 00000000 64000100 00000000 .... d .......
section .stabstr的內容: 0000 00。
mehoggan @ mehoggan:〜/代碼/ AsmWork/eatsyscall $

回答

3

如何使用的section .txtsection .text istead`

即:

SECTION .data     ; Section containing initialized data 
EatMsg: db "Eat at Joe's!",10 
EatLen: equ $-EatMsg 

SECTION .bss      ; Section containing uninitialized data 

SECTION .text     ; instead of .txt 

應該在gdb工作得很好之後,如果您位於x64架構上,請使用x64標誌。

0

似乎當前的CVS版本的GDB可以正常工作:「GNU gdb(GDB)7.3.50.20111108-cvs」和GDB 7.2。

聽起來像「Ubuntu/Linaro 7.3-0ubuntu2」以某種方式被打破。

1

我想我和你有同樣的問題。幾乎從字面上看。我正在通過Duntemann書中的同一個例子。 (源代碼中唯一的區別是我將字符串的一部分從Joe更改爲Bob,同時嘗試確認我在源代碼中所做的差異對編譯的可執行文件具有預期的效果。)

我已經發現有點好奇。我有兩臺計算機,並使用同步的保管箱目錄交替工作。老機器運行Ubuntu Karmic,因爲它對Duntemann書中的大部分內容提供了最好的支持。我試圖把Karmic放在新機器上,但有些東西根本不會安裝在它上面,因爲它不再被支持。所以我正在運行Ubuntu Oneiric。

這是事情。我可以在兩臺機器上編譯和運行exes。但是,在Oneiric機器上編譯的任何東西似乎都缺少gdb/kdbg/Insight樂於使用的符號信息。在Karmic機器上編譯的東西工作正常。一旦構建在Karmic機器上並與Dropbox同步,gdb/kdbg/Insight將在Oneiric機器上運行該exe文件。

所以這個問題似乎是Oneiric的編譯過程。它丟失或改變了一些東西,這些東西混淆了調試器正確使用它的能力。


這裏是業報目標文件的轉儲:

$ cat karmic.txt   

eatsyscall.o:  file format elf32-i38 

Contents of section .data: 
0000 45617420 61742042 6f622773 210a  Eat at Bob's!. 

Contents of section .text: 
0000 90b80400 0000bb01 000000b9 00000000 ................ 
0010 ba0e0000 00cd80b8 01000000 bb000000 ................ 
0020 00cd80        ...  

Contents of section .comment: 
0000 00546865 204e6574 77696465 20417373 .The Netwide Ass 
0010 656d626c 65722032 2e30352e 303100 embler 2.05.01. 

Contents of section .stab: 
0000 01000000 00000a00 02000000 01000000 ................ 
0010 64000000 00000000 00000000 44001a00 d...........D... 
0020 00000000 00000000 44001b00 01000000 ........D....... 
0030 00000000 44001c00 06000000 00000000 ....D........... 
0040 44001d00 0b000000 00000000 44001e00 D...........D... 
0050 10000000 00000000 44001f00 15000000 ........D....... 
0060 00000000 44002100 17000000 00000000 ....D.!......... 
0070 44002200 1c000000 00000000 44002300 D.".........D.#. 
0080 21000000        !...   

Contents of section .stabstr: 
0000 00656174 73797363 616c6c2e 61736d00 .eatsyscall.asm. 

這裏是解夢目標文件的轉儲:

$ cat oneiric.txt   

eatsyscall.o:  file format elf32-i386 

Contents of section .data: 
0000 45617420 61742042 6f622773 210a  Eat at Bob's!. 

Contents of section .text: 
0000 90b80400 0000bb01 000000b9 00000000 ................ 
0010 ba0e0000 00cd80b8 01000000 bb000000 ................ 
0020 00cd80        ... 

Contents of section .stab: 
0000 01000000 00000b00 02000000 01000000 ................ 
0010 64000000 00000000 00000000 44001a00 d...........D... 
0020 00000000 00000000 44001b00 01000000 ........D....... 
0030 00000000 44001c00 06000000 00000000 ....D........... 
0040 44001d00 0b000000 00000000 44001e00 D...........D... 
0050 10000000 00000000 44001f00 15000000 ........D....... 
0060 00000000 44002100 17000000 00000000 ....D.!......... 
0070 44002200 1c000000 00000000 44002300 D.".........D.#. 
0080 21000000 00000000 64000000 00000000 !.......d....... 

Contents of section .stabstr: 
0000 00656174 73797363 616c6c2e 61736d00 .eatsyscall.asm. 

你可以看到,這兩個文件是不同的(在非工作Oneiric文件末尾有幾個額外的字節)。看起來,無論nasm在Oneiric上做什麼,都無法與調試器一起正常播放。

+0

只是爲了跟進此: 我用祝福來編輯非兼容的.o文件,並手動歸零64對應的.stab部分中的最後'd'。 用這個手動修改過的文件重建exe後,一切正常。 這是64說它試圖創建一個64位的對象文件? (我的Oneiric版本是32位。) – Kaitain

0

嘗試使用部分/段的.text,而不是.txt或.CODE :)