ภาพสุดท้ายที่สร้างโดยผู้รวบรวมมีทั้งไฟล์ bin และไฟล์ ELF รูปแบบตัวโหลดแบบขยายความแตกต่างระหว่างสองไฟล์นี้คืออะไรโดยเฉพาะยูทิลิตี้ของไฟล์ ELF
ภาพสุดท้ายที่สร้างโดยผู้รวบรวมมีทั้งไฟล์ bin และไฟล์ ELF รูปแบบตัวโหลดแบบขยายความแตกต่างระหว่างสองไฟล์นี้คืออะไรโดยเฉพาะยูทิลิตี้ของไฟล์ ELF
คำตอบ:
ไฟล์ Bin เป็นไฟล์ไบนารีแท้ที่ไม่มีการแก้ไขหน่วยความจำหรือการย้ายตำแหน่งมากกว่าที่จะมีคำแนะนำที่ชัดเจนให้โหลดในที่อยู่หน่วยความจำที่ระบุ แต่ทว่า ....
ไฟล์ELFเป็นรูปแบบการเชื่อมต่อที่สามารถเรียกใช้งานได้ซึ่งประกอบด้วยการค้นหาสัญลักษณ์และตารางที่ย้ายตำแหน่งได้นั่นคือสามารถโหลดที่ที่อยู่หน่วยความจำใดก็ได้โดยเคอร์เนลและโดยอัตโนมัติสัญลักษณ์ทั้งหมดที่ใช้จะถูกปรับให้ตรงข้ามกับที่อยู่หน่วยความจำนั้น ถูกโหลดลงในไฟล์. โดยปกติไฟล์ ELF จะมีหลายส่วนเช่น 'data', 'text', 'bss' เพื่อตั้งชื่อ แต่มีไม่กี่ ... มันอยู่ในส่วนเหล่านั้นซึ่ง run-time สามารถคำนวณตำแหน่งที่จะปรับการอ้างอิงหน่วยความจำของสัญลักษณ์ แบบไดนามิกในเวลาทำงาน
ไฟล์ bin เป็นเพียงบิตและไบต์ที่เข้าไปใน ROM หรือแอดเดรสเฉพาะที่คุณจะเรียกใช้โปรแกรม คุณสามารถรับข้อมูลนี้และโหลดได้โดยตรงตามที่เป็นอยู่คุณต้องรู้ว่าที่อยู่ฐานคืออะไรแม้ว่าโดยปกติจะไม่มีอยู่ในนั้น
ไฟล์ elf มีข้อมูล bin แต่ล้อมรอบไปด้วยข้อมูลอื่น ๆ ข้อมูลการดีบักที่เป็นไปได้สัญลักษณ์สามารถแยกแยะรหัสจากข้อมูลภายในไบนารี อนุญาตให้มีข้อมูลไบนารีมากกว่าหนึ่งกลุ่ม (เมื่อคุณถ่ายโอนข้อมูลเหล่านี้ไปยังถังขยะคุณจะได้รับไฟล์ถังขยะขนาดใหญ่หนึ่งไฟล์พร้อมข้อมูลเติมเพื่อบรรจุลงในบล็อกถัดไป) บอกให้คุณทราบว่าคุณมีไบนารีเท่าใดและมีข้อมูล bss เท่าใดที่ต้องการเริ่มต้นเป็นศูนย์ (เครื่องมือ gnu มีปัญหาในการสร้างไฟล์ bin อย่างถูกต้อง)
รูปแบบไฟล์ elf เป็นแบบมาตรฐาน arm เผยแพร่การปรับปรุง / รูปแบบต่างๆในมาตรฐาน ฉันขอแนะนำให้ทุกคนเขียนโปรแกรมแยกวิเคราะห์เอลฟ์เพื่อทำความเข้าใจว่ามีอะไรอยู่ในนั้นไม่ต้องกังวลกับไลบรารีมันค่อนข้างง่ายเพียงแค่ใช้ข้อมูลและโครงสร้างในข้อมูลจำเพาะ ช่วยในการเอาชนะปัญหา gnu โดยทั่วไปในการสร้างไฟล์. bin ตลอดจนการดีบักสคริปต์ตัวเชื่อมโยงและสิ่งอื่น ๆ ที่สามารถช่วยทำให้ bin หรือเอลฟ์ของคุณยุ่งเหยิง
ทรัพยากรบางส่วน:
โดยทั่วไปรูปแบบ ELF เป็นเอาต์พุตเริ่มต้นของการคอมไพล์ หากคุณใช้โซ่เครื่องมือ GNU คุณสามารถแปลเป็นรูปแบบไบนารีได้โดยใช้ objcopy เช่น:
arm-elf-objcopy -O binary [elf-input-file] [binary-output-file]
หรือใช้ยูทิลิตี้ fromELF (สร้างขึ้นใน IDE ส่วนใหญ่เช่น ADS):
fromelf -bin -o [binary-output-file] [elf-input-file]
ฉันแค่อยากจะแก้ไขจุดตรงนี้ ไฟล์ ELF สร้างโดย Linker ไม่ใช่คอมไพเลอร์
ภารกิจคอมไพเลอร์สิ้นสุดลงหลังจากสร้างไฟล์อ็อบเจ็กต์ (* .o) จากไฟล์ซอร์สโค้ด Linker เชื่อมโยงไฟล์. o ทั้งหมดเข้าด้วยกันและสร้าง ELF
NOP
โดยไม่มี-f
(หรือ-fbin
) ไฟล์จะคอมไพล์เป็นไบต์เดียว0x90
แทนที่จะเป็นคอนเทนเนอร์ ELF 400 ไบต์ที่มี-felf32
. ดังนั้นแค่โค้ดดิบไม่มีข้อมูลเมตาของคอนเทนเนอร์ NASM กล่าวว่าส่วนใหญ่จะใช้สำหรับ MS-DOS .COM และ.sysไฟล์section
คำสั่งส่วนใหญ่จะถูกละเว้นและสร้างการจัดแนวเท่านั้น