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


10

สิ่งที่ฉันรู้แล้ว:

ปฏิบัติการของ ELF นั้นมีหลายส่วนโดยเฉพาะอย่างยิ่งส่วน. text และ. data ที่ถูกโหลดเข้าสู่หน่วยความจำเนื่องจากเป็นส่วนหลักของโปรแกรม แต่สำหรับโปรแกรมที่ทำงานมันต้องการข้อมูลเพิ่มเติมโดยเฉพาะเมื่อเชื่อมโยงแบบไดนามิก

สิ่งที่ฉันสนใจคือส่วนต่างๆเช่น. plt, .got, .dynamic, .dynsym, .dynstr etcetera ส่วนต่างๆของเอลฟ์ที่รับผิดชอบการเชื่อมโยงฟังก์ชั่นไปยังที่อยู่

จากสิ่งที่ฉันสามารถคิดได้จนถึงตอนนี้ก็คือสิ่งต่าง ๆ เช่น. symtab และ. strtab ไม่ได้รับการโหลด (หรือไม่อยู่) ในหน่วยความจำ แต่ .dynsym และ. dynstr ถูกใช้โดย linker หรือไม่ พวกเขาอยู่ในความทรงจำหรือไม่? ฉันสามารถเข้าถึงได้จากรหัสโปรแกรมหรือไม่

และมีส่วนใดของปฏิบัติการที่อยู่ในหน่วยความจำเคอร์เนล?

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

แจ้งให้เราทราบหากมีข้อสงสัยเกี่ยวกับคำถามของฉัน

คำตอบ:


12

ต่อไปนี้เป็นข้อมูลอ้างอิงที่ดีมาก: http://www.ibm.com/developerworks/linux/library/l-dynamic-l ไลบรารี / มันมีบรรณานุกรมในตอนท้ายของการอ้างอิงที่แตกต่างหลากหลายในระดับที่แตกต่างกัน หากคุณต้องการที่จะรู้ทุกรายละเอียดเต็มไปด้วยเลือดคุณสามารถตรงไปที่มา: http://www.akkadia.org/drepper/dsohowto.pdf (Ulrich Drepper เขียนตัวเชื่อมโยงแบบไดนามิกของ Linux)

คุณสามารถรับภาพรวมที่ดีของทุกส่วนในการปฏิบัติการของคุณโดยการรันคำสั่งเช่น "objdump -h myexe" หรือ "readelf -S myexe"

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

.got (Global Offset Table) และ. plt (Procedure Linkage Table) เป็นโครงสร้างหลักสองโครงสร้างที่จัดการโดยตัวเชื่อมโยงแบบไดนามิก . got เป็นตารางทางอ้อมสำหรับตัวแปรและ. plt เป็นตารางทางอ้อมสำหรับฟังก์ชั่น แต่ละไฟล์เรียกทำงานหรือไลบรารี (ซึ่งเรียกว่า "shared objects") มี. got และ. plt เป็นของตนเองและสิ่งเหล่านี้เป็นตารางของสัญลักษณ์ที่อ้างอิงโดยวัตถุที่ใช้ร่วมกันซึ่งมีอยู่ในวัตถุที่ใช้ร่วมกันอื่น ๆ

.dynsyn มีข้อมูลทั้งหมดเกี่ยวกับสัญลักษณ์ในวัตถุที่ใช้ร่วมกันของคุณ (ทั้งที่คุณกำหนดและที่อยู่ภายนอกที่คุณต้องการอ้างอิง) .dynsyn ไม่มีชื่อสัญลักษณ์จริง สิ่งเหล่านั้นมีอยู่ใน. dynstr และ. dynsyn มีพอยน์เตอร์เป็น. dynstr .gnu.hash เป็นตารางแฮชที่ใช้สำหรับค้นหาสัญลักษณ์อย่างรวดเร็วตามชื่อ นอกจากนี้ยังมีเฉพาะพอยน์เตอร์ (พอยน์เตอร์เป็น. dynstr และพอยน์เตอร์ที่ใช้สำหรับการสร้างกลุ่ม bucket)

เมื่อวัตถุที่ใช้ร่วมกันของคุณมีการปรับเปลี่ยนสัญลักษณ์ "foo" ตัวเชื่อมโยงแบบไดนามิกต้องค้นหา "foo" ในวัตถุแบบไดนามิกทั้งหมดที่คุณเชื่อมโยงกับเพื่อหาว่ามี "foo" อันใดที่คุณกำลังมองหา (และสิ่งที่เกี่ยวข้อง ที่อยู่ของ "foo" อยู่ในวัตถุที่ใช้ร่วมกัน) ตัวเชื่อมโยงแบบไดนามิกทำสิ่งนี้โดยการค้นหาส่วน. guu.hash ของวัตถุที่แชร์ที่เชื่อมโยงทั้งหมด (หรือส่วน. hash สำหรับวัตถุที่ใช้ร่วมกันเก่าที่ไม่มี. GNU ส่วนแฮช.) เมื่อพบที่อยู่ที่ถูกต้องในวัตถุที่เชื่อมโยงที่เชื่อมโยงแล้วมันจะใส่ไว้ใน. got หรือ. plt ของวัตถุที่ใช้ร่วมกันของคุณ


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

คุณพูดถูก เมื่อคุณถ่ายโอนข้อมูลหน่วยความจำคุณจะได้รับสำเนาของทุกหน้าที่ถูกแมปดังนั้นความแตกต่างระหว่าง "แมปเข้า vm" ​​และ "โหลดเข้า DRAM" ไม่เกี่ยวข้อง ฉันลบประโยคนั้นและคำตอบก็ดีขึ้น ขอบคุณ!
หลงลอจิก

ทำเครื่องหมายคำตอบของคุณว่าเป็นคำตอบเพราะมันเป็นข้อมูลมากที่สุดเท่าที่ฉันจะได้รับ :) จะต้องทำเองทั้งหมดมันเป็นงานวิจัยของฉัน
Dutchy

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