Хобрук: Ваш путь к мастерству в программировании

ошибка gdb - не в исполняемом формате: формат файла не распознан

При попытке отладить (после компиляции и компоновки) сборочную программу 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 и 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

  • Какие команды вы использовали для создания этого файла, из какого источника? Как выглядят первые 10 строк? head hello_world. Если это действительно текст ASCII, опубликуйте его в своем вопросе, чтобы мы могли сказать вам, что это за файл на самом деле. Настоящие исполняемые файлы ELF никогда не будут ошибочно приняты за текст ASCII — они начинаются с магического числа, отличного от ASCII, в двоичном формате. 19.03.2019
  • Как спрашивал Петр, как собирали и связывали? Вы загружаете правильный файл (выход компоновщика)? 19.03.2019
  • Итак, hello_world — ваш источник. Вы действительно должны назвать его hello_world.asm в соответствии с соглашением. ld производит выходные данные с именем a.out по умолчанию, поэтому загрузите их в gdb. Вы можете указать другое имя с опцией -o. Однако убедитесь, что вы не перезаписываете свой ввод :) 19.03.2019

Ответы:


1
   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 для сортировки списка каталогов по времени изменения индекса. Вы увидите a.out внизу после hello_world.o, что напомнит вам, что ld создал это вместо hello_world.

19.03.2019
  • @fuz: GNU binutils ld принимает -o output до или после входных имен файлов. Страница руководства только документирует размещение опций перед входными данными, но на практике это работает в любом случае. Я оставлю ваше редактирование в силе, потому что оно соответствует документации. 19.03.2019
  • Не все цепочки инструментов работают таким образом, и не рекомендуется распространять эту вредную привычку. В Руководстве по синтаксису утилит стандарта POSIX указано, что параметры идут перед операндами. ; проект GNU является основным игроком, не придерживающимся этого соглашения. 19.03.2019
  • Новые материалы

    Статическая типизация в TypeScript: основы Typescript
    Понимание статической типизации TypeScript, расширенный набор JavaScript, был разработан Microsoft в 2012 году для устранения некоторых ограничений JavaScript. Одним из его основных предложений..

    Как использовать SAAS на благо вашего бизнеса
    В деловом мире SAAS (программное обеспечение как услуга) становится все более популярным. И неудивительно, почему — SAAS предоставляет ряд преимуществ для предприятий любого размера. Вот лишь..

    Приложения случайного блуждания, часть 1 (статистика + машинное обучение)
    Смещенное случайное блуждание при динамической перколяции (arXiv) Автор: Себастьян Андрес , Нина Гантерт , Доминик Шмид , Перла Сузи Аннотация: мы изучаем смещенные случайные..

    Интеллектуальная масштабируемая обработка видео в реальном времени в Azure
    1. Введение В этом руководстве создается сквозной проект для интеллектуальной масштабируемой обработки видео в реальном времени в Azure. При этом создается возможность обнаруживать граффити и..

    Варианты использования положительной изотропной кривизны, часть 6 (машинное обучение)
    Четыре-орбифолды с положительной изотропной кривизной (arXiv) Автор : Хун Хуан Аннотация: Мы доказываем следующий результат: Пусть (X,g0) — полное связное 4-многообразие с равномерно..

    Внутри эпистатических сетей
    Регуляция нейронных сетей для лучшего прогнозирования ландшафтов биологической пригодности Сопоставьте свой индуктивный уклон с областью вашей проблемы Всем алгоритмам машинного обучения..

    Создание полноценного интерфейса командной строки с использованием Python | Расширенный Python
    Создание полноценного интерфейса командной строки с использованием Python — Advanced Python Чтобы изучить расширенные функции языка программирования, вам следует попробовать создать..