ไฟล์ ELF และไฟล์ bin ต่างกันอย่างไร


100

ภาพสุดท้ายที่สร้างโดยผู้รวบรวมมีทั้งไฟล์ bin และไฟล์ ELF รูปแบบตัวโหลดแบบขยายความแตกต่างระหว่างสองไฟล์นี้คืออะไรโดยเฉพาะยูทิลิตี้ของไฟล์ ELF


นี่คือสิ่งที่ NASM มีการพูด ไม่ใช่เฉพาะ ARM แต่น่าจะเป็นแนวคิดเดียวกัน เช่นหากคุณรวบรวมไฟล์ที่มีเพียงแค่NOPโดยไม่มี-f(หรือ-fbin) ไฟล์จะคอมไพล์เป็นไบต์เดียว0x90แทนที่จะเป็นคอนเทนเนอร์ ELF 400 ไบต์ที่มี-felf32. ดังนั้นแค่โค้ดดิบไม่มีข้อมูลเมตาของคอนเทนเนอร์ NASM กล่าวว่าส่วนใหญ่จะใช้สำหรับ MS-DOS .COM และ.sysไฟล์ sectionคำสั่งส่วนใหญ่จะถูกละเว้นและสร้างการจัดแนวเท่านั้น
Ciro Santilli 郝海东冠状病六四事件法轮功

นี่เป็นวิธีหนึ่งที่ไฟล์ bin จะมีประโยชน์: สร้างบูตเซกเตอร์เพื่อปรับใช้ระบบปฏิบัติการ: stackoverflow.com/a/32483545/895245
Ciro Santilli 郝海东冠状病六四事件法轮功

คำตอบ:


96

ไฟล์ Bin เป็นไฟล์ไบนารีแท้ที่ไม่มีการแก้ไขหน่วยความจำหรือการย้ายตำแหน่งมากกว่าที่จะมีคำแนะนำที่ชัดเจนให้โหลดในที่อยู่หน่วยความจำที่ระบุ แต่ทว่า ....

ไฟล์ELFเป็นรูปแบบการเชื่อมต่อที่สามารถเรียกใช้งานได้ซึ่งประกอบด้วยการค้นหาสัญลักษณ์และตารางที่ย้ายตำแหน่งได้นั่นคือสามารถโหลดที่ที่อยู่หน่วยความจำใดก็ได้โดยเคอร์เนลและโดยอัตโนมัติสัญลักษณ์ทั้งหมดที่ใช้จะถูกปรับให้ตรงข้ามกับที่อยู่หน่วยความจำนั้น ถูกโหลดลงในไฟล์. โดยปกติไฟล์ ELF จะมีหลายส่วนเช่น 'data', 'text', 'bss' เพื่อตั้งชื่อ แต่มีไม่กี่ ... มันอยู่ในส่วนเหล่านั้นซึ่ง run-time สามารถคำนวณตำแหน่งที่จะปรับการอ้างอิงหน่วยความจำของสัญลักษณ์ แบบไดนามิกในเวลาทำงาน


"เป็นไปได้มากกว่าที่จะมีคำแนะนำที่ชัดเจนให้โหลดในที่อยู่หน่วยความจำที่ระบุ" นั่นหมายความว่ากระบวนการสร้างไฟล์ bin จะเพิ่มรหัสเพิ่มเติมสำหรับการโหลดข้อมูลไปยังที่อยู่ที่ระบุหรือไม่
Penghe Geng

1
เท่าที่ฉันได้เรียนรู้คือไฟล์ bin เหมือนกับการเรียกใช้โปรแกรมจาก offset 0 และส่วนข้อมูลจะฝังอยู่ภายใน หากผิดโปรดแก้ไขให้ฉัน
Martin Kersten

@MartinKersten ถูกต้องไฟล์ bin เริ่มจาก offset 0.
t0mm13b

1
@ t0mm13b ดังนั้นไฟล์. self จึงสามารถเบิร์นลงในไมโครคอนโทรลเลอร์ได้เช่นเดียวกับไฟล์. hex ทั่วไป แต่ต้องใช้หน่วยความจำแฟลชมากกว่าและทุกครั้งที่รีเซ็ตไมโครส่วนที่อยู่จะเปลี่ยนไป?
Aelgawad

@BlackyDucky ฉันไม่เชื่อว่าจะเป็นไปได้ หากไมโครคอนโทรลเลอร์พยายามเรียกใช้ข้อมูล ELF โดยตรงมันจะตีความส่วนหัวและข้อมูลอื่น ๆ เป็นคำแนะนำผิดใช่ไหม?
jacobq

40

ไฟล์ bin เป็นเพียงบิตและไบต์ที่เข้าไปใน ROM หรือแอดเดรสเฉพาะที่คุณจะเรียกใช้โปรแกรม คุณสามารถรับข้อมูลนี้และโหลดได้โดยตรงตามที่เป็นอยู่คุณต้องรู้ว่าที่อยู่ฐานคืออะไรแม้ว่าโดยปกติจะไม่มีอยู่ในนั้น

ไฟล์ elf มีข้อมูล bin แต่ล้อมรอบไปด้วยข้อมูลอื่น ๆ ข้อมูลการดีบักที่เป็นไปได้สัญลักษณ์สามารถแยกแยะรหัสจากข้อมูลภายในไบนารี อนุญาตให้มีข้อมูลไบนารีมากกว่าหนึ่งกลุ่ม (เมื่อคุณถ่ายโอนข้อมูลเหล่านี้ไปยังถังขยะคุณจะได้รับไฟล์ถังขยะขนาดใหญ่หนึ่งไฟล์พร้อมข้อมูลเติมเพื่อบรรจุลงในบล็อกถัดไป) บอกให้คุณทราบว่าคุณมีไบนารีเท่าใดและมีข้อมูล bss เท่าใดที่ต้องการเริ่มต้นเป็นศูนย์ (เครื่องมือ gnu มีปัญหาในการสร้างไฟล์ bin อย่างถูกต้อง)

รูปแบบไฟล์ elf เป็นแบบมาตรฐาน arm เผยแพร่การปรับปรุง / รูปแบบต่างๆในมาตรฐาน ฉันขอแนะนำให้ทุกคนเขียนโปรแกรมแยกวิเคราะห์เอลฟ์เพื่อทำความเข้าใจว่ามีอะไรอยู่ในนั้นไม่ต้องกังวลกับไลบรารีมันค่อนข้างง่ายเพียงแค่ใช้ข้อมูลและโครงสร้างในข้อมูลจำเพาะ ช่วยในการเอาชนะปัญหา gnu โดยทั่วไปในการสร้างไฟล์. bin ตลอดจนการดีบักสคริปต์ตัวเชื่อมโยงและสิ่งอื่น ๆ ที่สามารถช่วยทำให้ bin หรือเอลฟ์ของคุณยุ่งเหยิง


1
0x7C00 ฟังดูเหมือน bootloader ซึ่งไม่ได้ใช้ elf เสมอไป นี่เป็นคำถามทั่วไป ระบบปฏิบัติการจะมีกฎสำหรับช่องว่างที่อยู่ (เสมือน) toolchain จะต้องถูกกำหนดเป้าหมายตามกฎของระบบปฏิบัติการนั้นรูปแบบไฟล์จะระบุรายการที่โหลดได้พร้อมที่อยู่และจุดเข้าเมื่อโหลดรวมถึงสิ่งอื่น ๆ เอลฟ์เป็นเพียงภาชนะเช่นกล่องคุณต้องบรรจุให้ถูกต้องสำหรับกรณีการใช้งานที่กำหนดเป้าหมาย
old_timer

1
หากคุณต้องการพิมพ์ ascii บางส่วนไปยัง vga คุณต้องเขียนโปรแกรมเพื่อทำสิ่งนั้นซึ่งมีข้อมูลบางอย่างหรือสร้างข้อมูลทางคณิตศาสตร์ในทันทีหรือรวมกันบางส่วนจากนั้นคุณโหลดโปรแกรมนั้นลงในพื้นที่โค้ดที่ระบบปฏิบัติการกำหนดแล้วเรียกใช้ มัน. โดยทั่วไปคุณจะไม่ยัดข้อมูลลงในอุปกรณ์ต่อพ่วงทางกายภาพและเป็นระบบปฏิบัติการที่หายากที่จะให้คุณทำเช่นนั้นต่อไปหรืออนุญาตให้ตัวโหลดทำเช่นนั้น
old_timer

1
สำหรับ bare metal โดยเฉพาะถ้าไฟล์ elf นี้เป็น bootloader และ / หรือโปรแกรมแรกที่รันจุดเข้าและ _start จะไม่เกี่ยวข้องเนื่องจากคุณใช้ไฟล์เอลฟ์เป็นสเต็ปสโตนสำหรับเครื่องมือที่โปรแกรมแฟลช (เช่น openocd over jtag) หรือผ่านไฟล์ไบนารีอะไรก็ได้ objcopy -O ไฟล์ self.bin จากนั้นไฟล์นั้นจะถูกโหลดลงในแฟลช ไม่ได้ไปแล้วลอง bootloader บน x86 แต่สมมติว่าไบออสไม่สามารถแยกวิเคราะห์ไฟล์เอลฟ์ได้ดังนั้นจึงต้องเป็นภาพความทรงจำเช่นกัน ดังนั้น a -O ไฟล์ bin ประเภทไบนารี
old_timer

1
เอนทิตีแยกต่างหากคือฮาร์ดแวร์ / ตรรกะหรือการออกแบบอื่น ๆ สำหรับระบบปฏิบัติการระบบปฏิบัติการจะสร้างกฎสำหรับไมโครคอนโทรลเลอร์การออกแบบชิป / โปรเซสเซอร์ทำให้กฎ ตัวอย่างเช่นหากมีตารางเวกเตอร์แล้วเวกเตอร์ชี้ไปที่ตัวจัดการที่คุณต้องม้วนทั้งหมดนั้นลงในสคริปต์ตัวเชื่อมโยงของคุณเป็นต้นเพื่อให้ข้อมูลที่โหลดได้ถูกกำหนดไว้สำหรับแฟลชที่สิ่งนั้นเริ่มทำงาน
old_timer

1
หากต้องการขยายให้กว้างขึ้นว่าเป้าหมายของคุณมีกฎไม่ว่าจะเป็นระบบปฏิบัติการหรือโปรเซสเซอร์หรือ bootloader แบบหลายขั้นตอนเป็นต้นและคุณต้องสร้าง "ไบนารี" ของคุณตามกฎเหล่านั้น bootstrap และ linkerscript มีความสำคัญที่สุด จากนั้นจะกว้างมากสำหรับแต่ละเป้าหมายและวิธีที่คุณใช้ไบนารีนั้นและรูปแบบไฟล์ที่รองรับ สมมติว่า gnu บนแพลตฟอร์มการพัฒนาโฮสต์จำนวนมากรูปแบบไฟล์เอลฟ์เป็นเอาต์พุตเริ่มต้นจากนั้นคุณใช้เครื่องมือตามต้องการ (หากยูทิลิตี้ / ตัวโหลดเฉพาะเป้าหมาย) เพื่อแยกหรือแปลงจากเอลฟ์เป็นอย่างอื่น
old_timer

30

ทรัพยากรบางส่วน:

  1. ELF สำหรับสถาปัตยกรรม ARM
    http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf
  2. ELF จาก wiki
    http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

โดยทั่วไปรูปแบบ 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]

6
นี้ถูกเพิ่มเข้ามาหลังจากรายละเอียดไฟล์ bin ก็ได้รับคำตอบและไม่ add-on เทคนิคที่มีประโยชน์ในทางปฏิบัติ +1 สำหรับสิ่งนั้น
erbdex

-1

ฉันแค่อยากจะแก้ไขจุดตรงนี้ ไฟล์ ELF สร้างโดย Linker ไม่ใช่คอมไพเลอร์

ภารกิจคอมไพเลอร์สิ้นสุดลงหลังจากสร้างไฟล์อ็อบเจ็กต์ (* .o) จากไฟล์ซอร์สโค้ด Linker เชื่อมโยงไฟล์. o ทั้งหมดเข้าด้วยกันและสร้าง ELF


โหวตลดลงเนื่องจากไม่ตอบคำถามหรือไม่ถูกต้อง การรวบรวมที่กำหนดไว้อย่างกว้างรวมถึงการเชื่อมโยง อ้างจากldเอกสาร : โดยปกติขั้นตอนสุดท้ายในการคอมไพล์โปรแกรมคือการรัน ld
bzeaman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.