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

StackOverflow https://stackoverflow.com/questions/275471

  •  07-07-2019
  •  | 
  •  

Вопрос

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

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, но, насколько я могу судить, в данном случае он должен работать.Есть идеи, что происходит не так?

Это было полезно?

Решение

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

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

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

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

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

gdb executable-file core-file

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

gdb executable-file

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

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

Что вам нужно проверить, так это библиотека 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 Debugger ( lldb ), который стремится заменить его. Он поддерживает наборы команд i386, x86-64 и ARM.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top