ส่วนหัวของโปรแกรมและส่วนหัวของส่วนในไฟล์ ELF

นี่เป็นคำถามซ้ำ แต่ฉันไม่สามารถหาคำตอบสำหรับคำถามของฉันได้อย่างรวดเร็ว นั่นเป็นเหตุผลที่ถามมัน

ไฟล์ ELF บางไฟล์มีส่วนหัวของโปรแกรม (executables หรือ shared libs) ซึ่งอธิบายส่วนต่างๆ ประกอบด้วยฟิลด์ที่เรียกว่าที่อยู่เสมือนและออฟเซ็ตไฟล์ และฟิลด์อื่นๆ บางฟิลด์

นอกจากนี้ยังมีส่วนที่เกี่ยวข้องซึ่งอธิบาย "ที่อยู่ในหน่วยความจำ" และออฟเซ็ตไฟล์

ตอนนี้ฉันสับสนเล็กน้อยว่าส่วนต่างๆ และส่วนต่างๆ เกี่ยวข้องกันอย่างไร (สำหรับไฟล์ปฏิบัติการที่คอมไพล์แบบคงที่และสำหรับไฟล์ปฏิบัติการที่ไม่คอมไพล์แบบคงที่) ค่าออฟเซ็ตของไฟล์สำหรับไบนารีที่คอมไพล์แบบคงที่แตกต่างกันอย่างไร มีความสัมพันธ์ระหว่างที่อยู่เสมือนในส่วนหัวของโปรแกรมและที่อยู่หน่วยความจำในส่วนหัวของส่วนหรือไม่

ขอบคุณ


person agent.smith    schedule 14.08.2014    source แหล่งที่มา
comment
ตัวฉันเองพบบทความดีๆ ที่ช่วยคลายความสับสนส่วนใหญ่: mylinuxbook.com/readelf-command   -  person agent.smith    schedule 14.08.2014
comment
คุณช่วยสรุปสิ่งที่คุณได้เรียนรู้ในรูปแบบของการตอบคำถามของคุณได้ไหม   -  person Ross Ridge    schedule 15.08.2014


คำตอบ (1)


ส่วนคือขอบเขตต่อเนื่องที่เล็กที่สุดของไฟล์ ดังนั้นไฟล์ ELF จึงถูกแบ่งออกเป็นส่วนต่างๆ ส่วนต่างๆ ไม่สามารถทับซ้อนกันได้ กล่าวคือ ไม่มีไบต์ใดที่สามารถเป็นส่วนหนึ่งของมากกว่าหนึ่งส่วนได้ แต่อาจมีไบต์ที่ไม่อยู่ในส่วนใดๆ ("ขยะ")

โดยทั่วไปส่วนต่างๆ ใช้เพื่อวัตถุประสงค์ในการเชื่อมโยง ประกอบด้วยส่วนต่างๆ ของไฟล์ที่สามารถจัดเรียงใหม่ รวม ฯลฯ โดยตัวเชื่อมโยง

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

ทุกส่วนที่อยู่ในไฟล์ ELF มีการอธิบายไว้ในตารางส่วนหัวของส่วน โดยแต่ละส่วนจะมีรายการอยู่ในนั้น

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

ส่วนที่สามารถโหลดได้อธิบายไว้ในตารางส่วนหัวของโปรแกรม

เรื่องสั้นแบบยาว:
ในไฟล์ปฏิบัติการ คุณมีส่วนต่างๆ ที่สามารถแบ่งย่อยออกเป็นส่วนต่างๆ เพิ่มเติมได้ เซ็กเมนต์ถูกโหลดลงในหน่วยความจำของกระบวนการ ส่วนต่างๆ เป็นทางเลือก แต่สามารถช่วยแบ่งย่อยส่วนต่างๆ เพิ่มเติมหรืออธิบายเนื้อหาได้ ในโมดูลที่ย้ายตำแหน่งได้ (เอาต์พุตของคอมไพเลอร์, ไฟล์ .o) เป็นอีกวิธีหนึ่ง: ส่วน จำเป็น เนื่องจากโมดูลเหล่านี้จะอธิบายสิ่งที่อยู่ในไฟล์และอนุญาตให้มีการเชื่อมโยง


สำหรับที่อยู่และสิ่งของหน่วยความจำ:
ในระบบสมัยใหม่ เฉพาะที่อยู่เสมือนเท่านั้นที่สำคัญ กระบวนการถูกหลอกลวงโดยระบบปฏิบัติการที่ทำงานโดยลำพังในหน่วยความจำ โดยมีพื้นที่ที่อยู่ทั้งหมดที่มีอยู่ (แม้ว่าจะไม่ใช่ ทั้งหมด พื้นที่ที่อยู่อาจสามารถใช้งานได้ในเวลาเดียวกันเนื่องจากข้อจำกัดของหน่วยความจำกายภาพ ). ระบบจะแมปที่อยู่เสมือนกับที่อยู่ทางกายภาพได้ทันที โดยโปร่งใสต่อกระบวนการ

ที่อยู่ทางกายภาพไม่ได้ใช้ ดังนั้นจึงสามารถปล่อยให้เป็นศูนย์ได้ แต่สามารถตั้งค่าเป็นที่อยู่เดียวกันได้ในกรณีนี้

person BarbaraKwarc    schedule 04.07.2018