ดังที่กล่าวไว้ในเหตุใดแพคเกจซอฟต์แวร์จึงทำงานได้ดีแม้ว่าจะทำการอัปเกรดแล้ว ล็อคถูกวางไว้บน inode ไม่ได้อยู่ในชื่อไฟล์ เมื่อคุณโหลดและรันไบนารีไฟล์จะถูกทำเครื่องหมายว่าไม่ว่าง - ซึ่งเป็นสาเหตุที่คุณได้รับข้อผิดพลาด ETXTBSY (ไฟล์ไม่ว่าง) เมื่อคุณพยายามเขียนลงไฟล์
ตอนนี้สำหรับห้องสมุดที่ใช้ร่วมกันจะแตกต่างกันเล็กน้อย: mmap()
ห้องสมุดได้รับหน่วยความจำแมปลงในพื้นที่ที่อยู่ในกระบวนการด้วย แม้ว่าMAP_DENYWRITE
อาจมีการระบุไว้อย่างน้อย Glibc บน Linux จะไม่สนใจมันอย่างเงียบ ๆ (ตามหน้า man, ตรวจสอบแหล่งข้อมูล) - ตรวจสอบกระทู้นี้ ดังนั้นคุณจริงได้รับอนุญาตให้เขียนไฟล์และมันเป็นหน่วยความจำที่แมปการเปลี่ยนแปลงใด ๆ จะมองเห็นได้เกือบจะในทันที - ซึ่งหมายความว่าถ้าคุณลองพอที่ยากที่คุณสามารถจัดการเพื่อ อิฐเครื่องของคุณโดยการเขียนทับห้องสมุด
วิธีที่ถูกต้องในการอัพเดทคือ:
ลบไฟล์ซึ่งจะลบการอ้างอิงถึงข้อมูลจากระบบไฟล์เพื่อให้ไม่สามารถเข้าถึงได้สำหรับแอปพลิเคชันที่เพิ่งเกิดใหม่ที่อาจต้องการใช้งานในขณะที่ยังคงสามารถเข้าถึงข้อมูลได้สำหรับทุกคนที่เปิดไฟล์อยู่แล้ว ;
การสร้างไฟล์ใหม่ด้วยเนื้อหาที่อัพเดท
กระบวนการที่สร้างขึ้นใหม่จะใช้เนื้อหาที่อัปเดตการเรียกใช้แอปพลิเคชันจะเข้าถึงเวอร์ชันเก่า นี่คือสิ่งที่ยูทิลิตี้การจัดการแพคเกจมีสติไม่ โปรดทราบว่าอาจไม่สมบูรณ์โดยไม่มีอันตรายใด ๆ - ตัวอย่างเช่นแอปพลิเคชันการโหลดรหัสแบบไดนามิก (โดยใช้dlsym()
และเพื่อน) จะประสบปัญหาหาก API ของห้องสมุดเปลี่ยนไปอย่างเงียบ ๆ
หากคุณต้องการอยู่ในด้านที่ปลอดภัยจริงๆปิดระบบติดตั้งระบบไฟล์จากอินสแตนซ์ของระบบปฏิบัติการอื่นอัปเดตและนำระบบที่อัปเดตขึ้นมาอีกครั้ง
.so
ไฟล์โดยใช้ldd filename.so
เพื่อตรวจสอบการพึ่งพา