ELF แชร์ไลบรารี - แรงจูงใจสำหรับ PLT


11

สามารถใช้รหัสการแก้ไขด้วยตนเองเพื่อเร่งความเร็วการเรียกฟังก์ชันในไลบรารีที่ลิงก์แบบไดนามิกหรือไม่

เท่าที่ฉันเข้าใจห้องสมุดที่ใช้ร่วมกันของ ELF ใช้ตารางกระโดดทางอ้อม (ตารางเชื่อมโยงโพรซีเดอร์หรือ PLT) เพื่อเปิดใช้งานฟังก์ชันไลบรารีผูกพัน ดูเหมือนว่ามีวัตถุประสงค์เพื่อหลีกเลี่ยงการแก้ไขตารางในส่วนรหัสในขณะที่ยังเปิดใช้งานการแก้ปัญหาตำแหน่งฟังก์ชันที่ขี้เกียจในการโทรครั้งแรก

มันจะเร็วกว่าที่จะสร้างรหัสแบบไดนามิกสำหรับตารางนั้น ณ เวลาที่โหลดหรืออาจเป็นไปได้ที่การเรียกใช้ฟังก์ชันแรก

มันคือการเปิดใช้งานการแบ่งปันส่วนรหัสระหว่างกระบวนการมากที่สุด (ตารางแบบไดนามิกจะเป็นส่วนตัวกับกระบวนการ)? เป็นเพราะเหตุผลด้านความปลอดภัย (โค้ดที่เขียนได้ไม่ควรเรียกใช้งานได้แต่ JIT ทำตลอดเวลาและสิทธิ์ในการเขียนสามารถเพิ่มและลบออกได้โดยตัวโหลดก่อนที่จะเริ่มโปรแกรมจริง ๆ )

หรือเป็นการรวมกันของสิ่งเหล่านี้และประสิทธิภาพที่เพิ่มขึ้นเล็กน้อยต่อการเรียกใช้ฟังก์ชันจะไม่คุ้มค่ากับความพยายาม?

คำตอบ:


8

ฉันคิดว่าเรากำลังพูดถึงสถาปัตยกรรม x86

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

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

กระบวนการทั้งหมดที่คุณอธิบายมีความซับซ้อนและจะต้องใช้เวลาในการประมวลผลนานกว่าวิธี PLT ที่ใช้ในปัจจุบันและอาจแนะนำปัญหาความปลอดภัยที่ใหม่และน่าสนใจมากขึ้น


2
คุณสามารถใช้การเรียกระบบ mprotect (2) เพื่อสร้างเพจเซ็กเมนต์. text ที่เขียนได้และเรียกใช้งานได้
Bruce Ediger

1
ถูกต้องแล้วครับ อาจเป็นไปได้ว่าระบบของยูนิกซ์จะทำงานได้ดี แต่กระบวนการเชื่อมโยงทั้งหมดจะพังทันทีที่มีคนพยายามทำให้ระบบแข็งขึ้นด้วยเช่น PaX ซึ่งบังคับใช้ข้อ จำกัด ของ mprotect (2)
dkaragasidis

(ดูเหมือนว่าฉันไม่ได้พูดถึง @BruceEdiger ในความคิดเห็นก่อนหน้าของฉัน)
dkaragasidis

1

ELF DSOs อาจใช้การตั้งค่าสถานะ (DF_TEXREL) เพื่อประกาศว่าพวกเขาต้องการการเปลี่ยนตำแหน่งใหม่โดยการแก้ไขส่วนข้อความ (ซึ่งโดยปกติจะเป็นแบบอ่านอย่างเดียว) อย่างไรก็ตามวิธีการข้ามตารางพร้อมกับรหัสอิสระของตำแหน่ง PIE ควรเป็นวิธีที่เหมาะสมที่สุด

(พบว่าในhttp://www.akkadia.org/drepper/dsohowto.pdfแต่แหล่งข้อมูลอื่นพูดถึงเรื่องนี้ด้วย)

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