فشل جدب لتشغيل ELF برنامج 64 بت مع "تنسيق الملف غير معترف بها"

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

  •  07-07-2019
  •  | 
  •  

سؤال

وأنا أحاول أن استخدام 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، ويتم ترجمة للتنفيذ مع دول مجلس التعاون الخليجي النسخة 3.4.6.

وأنا خارج قليلا من بلدي المياه من حيث استخدام جدب، ولكن بقدر ما استطيع ان اقول انها ينبغي أن يكون العمل في هذه الحالة. أي أفكار ما يحدث خطأ؟

هل كانت مفيدة؟

المحلول

والقابل للتنفيذ هو 64 بت (إكس86-64) والمصحح هو 32 بت (i686-PC-لينكس) بناء. قد تحتاج إلى تثبيت إصدار 64 بت (إكس86-64) من المصحح.

نصائح أخرى

ولست متأكدا إذا كان هذا هو مشكلتك، ولكن أنا واجهت هذا الموقف في كثير من الأحيان. القابل للتنفيذ في شجرة بناء، بناء عن طريق جعل / automake ليس ثنائي، ولكن السيناريو، لذلك لا يمكنك استخدام جدب معها. محاولة لتثبيت التطبيق وتغيير الدليل، لأن آخر جدب يحاول تصحيح البرنامج النصي.

والسؤال يشير إلى "./filename" و "/ مسار / قابل للتنفيذ". هل هذه هي نفس الملف؟

إذا كنت تفعل تحليل ما بعد الوفاة، فإن تشغيل:

gdb executable-file core-file

إذا كنت تسير على تجاهل ملف الأساسية، يمكنك تشغيل:

gdb executable-file

في كلتا الحالتين، "executable-file" يعني اسم مسار إلى ثنائي تريد تصحيحه. أكثر عادة، وهذا هو في الواقع اسم ملف بسيط في الدليل الحالي، لأن لديك شفرة المصدر من بناء التصحيح الخاص بك هناك.

في سولاريس، ومن المفترض بناء 64 بت من GDB لتكون قادرة على تصحيح كلا التنفيذية 32 بت و 64 بت (على الرغم من أنني قد كان بعض القضايا مع الإصدارات الأخيرة من GDB). لست متأكدا من العكس - أن GDB 32 بت يمكن تصحيح بالضرورة التنفيذية 64 بت

.

وماذا تحتاج إلى أن يكون فحص، هو في الحقيقة المكتبة BFD. و اصف ملف ثنائي مكتبة هو ما يستخدم بينوتيلس / جدب تحليل الواقع والتعامل مع ثنائيات (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، إكس86-64 ومجموعات التعليمات ARM.

وأنها متاحة بشكل افتراضي على BSD / OS X، على لينكس تثبيت عن طريق: sudo apt-get install lldb (أو استخدام yum).

وانظر: جدب إلى lldb القيادة الصفحة خريطة للحصول على مزيد من المعلومات

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top