Ошибка GDB- "не в исполняемом формате: формат файла не распознан" - PullRequest
0 голосов
/ 19 марта 2019

При попытке отладить (после компиляции и компоновки) программу сборки 86-64x под названием hello_world, я получил ошибку GDB "не в исполняемом формате: формат файла не распознан".

ubuntu@ubuntu:~$ gdb hello_world
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 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 "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
"/home/ubuntu/hello_world": not in executable format: File format not recognized

Я использую Ubuntu 64x OS и GDB 8.1.0 64x.

Я искал другие ответы, но не мог понять, что делать, или решение было для Mac OS.

При работе

`ubuntu@ubuntu:~$ file hello_world

Я получил

hello_world: ASCII text

Посмотрев этот ответ Я понял, что GDB не знает, что делать с этим файлом, но я не понял, как изменить формат файла.

Моя программа hello_world:

global _start

section .text

 _start:
  mov rax,1
  mov rdi,1
  mov rsi,message
  mov rdx,13

  syscall

  mov rax,60
  xor rdi,rdi

  syscall

  section .data
  message: db "Hello, World",10

Я скомпилировал и связал, используя следующие команды:

   ubuntu@ubuntu:~$ nasm -felf64 hello_world
   ubuntu@ubuntu:~$ ld hello_world.o

1 Ответ

5 голосов
/ 19 марта 2019
   ubuntu@ubuntu:~$ nasm -felf64 hello_world
   ubuntu@ubuntu:~$ ld hello_world.o

hello_world - ваш исходный файл;это то, на чем вы запускали NASM.Обычно вы называете исходный файл NASM hello_world.asm, например, C hello_world.c.

Выходным файлом по умолчанию для ld является a.out, поэтому ваша команда создалаисполняемый файл с именем a.out.Если вы хотите создать исполняемый файл с именем hello_world, вам нужно использовать
ld -o hello_world hello_world.o.

(который перезапишет ваш источник, если вы сначала не переименуете его в .asm. Это почему принято использовать расширение для исходных файлов.)


Вы могли бы получить подсказку, запустив ls -lcrt для сортировки списка каталогов по времени изменения inode.Вы увидите a.out внизу после hello_world.o, который будет напоминать вам, что ld создал это вместо hello_world.

...