Символы NASM и GDB: «Не удается найти какие-либо разделы кода в файле символов». - PullRequest
2 голосов
/ 13 ноября 2011

Я пытаюсь получить простой пример работы из сборочной книги, которую читаю.Я пытаюсь заставить GDB работать с моей простой программой сборки, которую я собираю с помощью ассемблера NASM.Ниже приведен код и объектный файл в формате elf.

; 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

и

mehoggan@mehoggan:~/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 на исполняемом файле, я получаю следующее:

mehoggan@mehoggan:~/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

mehoggan@mehoggan:~/Code/AsmWork/eatsyscall$ cat /etc/*release*
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=11.10
DISTRIB_CODENAME=oneiric
DISTRIB_DESCRIPTION="Ubuntu 11.10"
mehoggan@mehoggan:~/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
mehoggan@mehoggan:~/Code/AsmWork/eatsyscall$

- Обновление -

Даже если я выберу 64-битный маршрут со следующими командами, у меня все равно не получится:

mehoggan @ mehoggan: ~ / Code / AsmWork / eatsyscall $ nasm -f elf64 -g -F stabs eatsyscall.asmmehoggan @ mehoggan: ~ / Code / AsmWork / eatsyscall $ ld -o eatsyscall eatsyscall.o -melf_x86_64 mehoggan @ mehoggan: ~ / Code / AsmWork / eatsyscall $ ./eatsyscall bash: ./eatsyscg: невозможно выполнить двоичный файл~ / Code / AsmWork / eatsyscall $ objdump -s eatsyscall.o

eatsyscall.o: формат файла elf64-x86-64

Содержание раздела .data: 0000 45617420 6174204a 6f652773 210a Ешьте у Джо!.
Содержание раздела .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.
Содержимое раздела .stab: 0000 00000000 64000100 00000000 .... d .......
Содержимое раздела .stabstr: 0000 00.
mehoggan @ mehoggan: ~ / Code / AsmWork / eatsyscall $

Ответы [ 4 ]

3 голосов
/ 13 ноября 2011

Как насчет использования section .text вместо section .txt? `

То есть:

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.

1 голос
/ 19 мая 2012

Я думаю, у меня та же проблема, что и у вас. Почти буквально. Я работаю над тем же примером в книге Дюнтманна. (Единственное отличие в исходном коде состоит в том, что я изменил часть строки с Джо на Боба, пытаясь подтвердить, что различия, которые я внес в исходный код, оказали ожидаемое влияние на скомпилированный исполняемый файл.)

То, что я обнаружил, немного любопытно. У меня есть два компьютера, и я работаю поочередно на каждом из них, используя синхронизированный каталог dropbox. Более старая машина работает под управлением Ubuntu Karmic, потому что она лучше всего поддерживает большинство вещей из книги Дунтеманна. Я также пытался установить Karmic на новую машину, но некоторые вещи просто не будут устанавливаться на нее, потому что она больше не поддерживается. Поэтому я использую на нем Ubuntu Oneiric.

Вот в чем дело. Я могу скомпилировать и запустить exes на обеих машинах. Но все, что скомпилировано на машине Oneiric, похоже, не содержит символьной информации, с которой рад работать gdb / kdbg / Insight. Материал, скомпилированный на машине Кармика, работает отлично. После того, как gdb / kdbg / Insight будет построен на машине Karmic и синхронизирован с Dropbox, он будет работать ТОЛЬКО на компьютере Oneiric.

Таким образом, проблема заключается в процессе компиляции в Oneiric. Отсутствует или изменяется что-то, что портит способность отладчиков правильно работать с ним.


Вот дамп объектного файла Karmic:

$ 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.

Вот дамп объектного файла Oneiric:

$ 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 голосов
/ 10 апреля 2016

попробуйте использовать секцию / сегмент .text вместо .txt или .code:)

0 голосов
/ 13 ноября 2011

Кажется, работает нормально с текущей версией CVS GDB: «GNU gdb (GDB) 7.3.50.20111108-cvs», а также с GDB 7.2.

Звучит так, будто "Ubuntu / Linaro 7.3-0ubuntu2" каким-то образом сломан.

...