Gdb не может запустить 64-битную программу ELF с сообщением «Формат файла не распознан»

Я пытаюсь использовать GDB для отладки (чтобы найти раздражающий segfault). Когда я бегу:

gdb ./filename

из командной строки я получаю следующую ошибку:

This GDB was configured as "i686-pc-linux-
gnu"..."/path/exec": not in executable 
format: File format not recognized

Когда я выполняю:

file /path/executable/

Я получаю следующую информацию:

 ELF 64-bit LSB executable, AMD x86-64,
 version 1 (SYSV), for GNU/Linux 2.4.0, 
 dynamically linked (uses shared libs), not stripped

Я использую GDB 6.1, а исполняемый файл скомпилирован с помощью gcc версии 3.4.6.

Я немного не в себе с точки зрения использования gdb, но, насколько я могу судить, в этом случае он должен работать. Есть идеи, что не так?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
13
0
28 099
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Исполняемый файл является 64-битным (x86-64), а отладчик - 32-битной (i686-pc-linux) сборкой. Возможно, вам потребуется установить 64-битную (x86-64) версию отладчика.

благодаря. Я подумал, что это может быть проблемой, и оказалось, что 64-разрядная версия gdb установлена ​​по более неясному пути на том же компьютере.

pbh101 10.11.2008 10:38

Спасибо - у меня возникла эта проблема после установки пакета debian gdb: i386 и некоторых других несколько дней назад, чтобы избежать создания chroot для сборки i386 версии пакета debian.

frankster 27.03.2014 19:59

Для меня это было почти то же самое, когда я не мог отлаживать приложение для Android из QtCreator. 32-битный gdbserver использовался, в то время как у меня было 64-битное устройство Android

rightaway717 09.06.2015 11:24

Вопрос относится к «./filename» и к «/ путь / исполняемый файл». Это один и тот же файл?

Если вы делаете посмертный анализ, вы должны запустить:

gdb executable-file core-file

Если вы собираетесь игнорировать основной файл, вы должны запустить:

gdb executable-file

В обоих случаях «executable-file» означает путь к двоичному файлу, который нужно отлаживать. Чаще всего это простое имя файла в текущем каталоге, поскольку там у вас есть исходный код отладочной сборки.

В Solaris предполагается, что 64-битная сборка GDB может отлаживать как 32-битные, так и 64-битные исполняемые файлы (хотя у меня были некоторые проблемы с последними версиями GDB). Я не уверен в обратном - что 32-битный GDB обязательно может отлаживать 64-битные исполняемые файлы.

Не уверен, что это ваша проблема, но я очень часто сталкивался с такой ситуацией. Исполняемый файл в дереве сборки, созданный make / automake, является не двоичным файлом, а скриптом, поэтому вы не можете использовать с ним gdb. Попробуйте установить приложение и сменить каталог, иначе GDB попытается отладить скрипт.

Это не моя проблема, но я это проверял. Спасибо за помощь. Насколько я могу судить, вы можете запустить file с исполняемым файлом, чтобы проверить, является ли он двоичным.

pbh101 10.11.2008 10:39

@quinmars, не могли бы вы объяснить немного больше, что вы имеете в виду под Try to install the application and change the directory, у меня была такая же проблема, при проверке типа файла это был POSIX shell script

Hady Elsahar 05.06.2015 12:30

@HadyElsahar Под установить я имел в виду make install. Но на самом деле установка не требуется. Следуйте объяснениям здесь: sourceware.org/autobook/autobook/…

quinmars 05.06.2015 12:41

@quinmars, при выполнении libtool --mode=execute gdb th он все еще дает ту же ошибку. я переместил вопрос в другую ветку здесь stackoverflow.com/questions/30663780/…

Hady Elsahar 05.06.2015 13:17

Что вам нужно проверить, это действительно библиотеку bfd. Библиотека дескриптор двоичного файла - это то, что binutils / gdb использует для фактического анализа и обработки двоичных файлов (ELF / a.out и т. д.).

Вы можете увидеть текущие поддерживаемые платформы через objdump;

# objdump -H

objdump: supported targets: elf32-powerpc aixcoff-rs6000 elf32-powerpcle ppcboot elf64-powerpc elf64-powerpcle elf64-little elf64-big elf32-little elf32-big srec symbolsrec tekhex binary ihex
objdump: supported architectures: rs6000:6000 rs6000:rs1 rs6000:rsc rs6000:rs2 powerpc:common powerpc:common64 powerpc:603 powerpc:EC603e powerpc:604 powerpc:403 powerpc:601 powerpc:620 powerpc:630 powerpc:a35 powerpc:rs64ii powerpc:rs64iii powerpc:7400 powerpc:e500 powerpc:MPC8XX powerpc:750

The following PPC specific disassembler options are supported for use with
the -M switch:
  booke|booke32|booke64    Disassemble the BookE instructions
  e300                     Disassemble the e300 instructions
  e500|e500x2              Disassemble the e500 instructions
  efs                      Disassemble the EFS instructions
  power4                   Disassemble the Power4 instructions
  power5                   Disassemble the Power5 instructions
  power6                   Disassemble the Power6 instructions
  32                       Do not disassemble 64-bit instructions
  64                       Allow disassembly of 64-bit instructions

Кажется, ваш отладчик GNU (gdb) не поддерживает архитектуру x86_64.

Поэтому попробуйте Отладчик LLDB (lldb), который призван заменить его. Он поддерживает наборы инструкций i386, x86-64 и ARM.

Он доступен по умолчанию в BSD / OS X, в Linux устанавливается через: sudo apt-get install lldb (или используйте yum).

См .: страницу карта команд gdb в lldb для получения дополнительной информации.

Другие вопросы по теме