فشل جدب لتشغيل ELF برنامج 64 بت مع "تنسيق الملف غير معترف بها"
سؤال
وأنا أحاول أن استخدام 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 القيادة الصفحة خريطة للحصول على مزيد من المعلومات