ลำดับที่ตัวเชื่อมโยงแบบไดนามิกของ Linux ค้นหาเส้นทางคืออะไร


14

/etc/ld.so.confนี้ไม่ได้เป็นที่ซ้ำกันเพราะนี่คือการจัดการกับความไม่ชอบมาพากลผมสังเกตเห็นเมื่อฉันใช้

ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"เพื่อให้ได้เส้นทางที่ใช้การค้นหาแบบไดนามิกในลิงเกอร์สำหรับห้องสมุดผมเรียกใช้คำสั่ง เมื่อ/etc/ld.so.confไม่มีเส้นทางที่ระบุไว้ในนั้น เอาต์พุตจากคำสั่งก่อนหน้าคือ

/lib
/usr/lib

ฉันคิดว่ามันค้นหาเป็นครั้งแรกแล้ว/lib /usr/libเมื่อฉันเพิ่มเส้นทางใหม่เช่น/usr/local/libไปยัง/etc/ld.so.confแล้วสร้างใหม่/etc/ld.so.cacheผลลัพธ์จากการldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"กลายเป็น

/usr/local/lib
/lib
/usr/lib

ฉันพบนี้แปลกเพราะถ้าผมถูกต้องว่าคำสั่งที่ระบุไว้ไดเรกทอรีที่มีการค้นหาในคือจากบนลงล่างแล้วไดเรกทอรีเพิ่มเติมที่จะค้นหาก่อนและ/lib /usr/libว่าไดเรกทอรีเพิ่มเติมที่จะค้นหาก่อนไดเรกทอรีที่เชื่อถือได้ไม่แปลกในตัวเอง แต่เมื่อ/libมีการค้นหาก่อน/usr/libที่แปลกเพราะ/binและ/sbinมีการค้นหาหลังจาก/usr/binและใน/usr/sbinPATH

แม้ว่าเส้นทางที่ระบุไว้โดยldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"ถูกค้นจากด้านล่างสู่ด้านบนก็จะยังคงสั่งเบ้เพราะไดเรกทอรีเพิ่มเติมจะได้รับการสืบค้นหลังจากคนที่เชื่อถือได้ในขณะที่จะได้รับการสืบค้นหลัง/lib/usr/lib

ดังนั้นคำสั่งที่ld.soค้นหาพา ธ สำหรับห้องสมุดมีอะไรบ้าง ทำไม/libสืบค้นก่อน/usr/lib? ถ้ามันไม่ได้แล้วทำไมเป็นไดเรกทอรีเพิ่มเติมสืบค้นหลัง/lib?

คำตอบ:


17

ld.soการสั่งซื้อที่ได้รับการบันทึกในคู่มือของลิงเกอร์แบบไดนามิกซึ่งเป็น มันคือ:

  1. ไดเรกทอรีจากLD_LIBRARY_PATH;
  2. ไดเรกทอรีจาก/etc/ld.so.conf;
  3. /lib;
  4. /usr/lib.

(ฉันจะทำให้มันง่ายขึ้นเล็กน้อยดูคู่มือสำหรับรายละเอียดทั้งหมด)

คำสั่งซื้อเหมาะสมเมื่อคุณพิจารณาว่าเป็นวิธีเดียวที่จะแทนที่ไลบรารีในตำแหน่งเริ่มต้นด้วยไลบรารีที่กำหนดเอง LD_LIBRARY_PATHเป็นการตั้งค่าผู้ใช้มันจะต้องมาก่อนคนอื่น ๆ /etc/ld.so.confเป็นการตั้งค่าท้องถิ่นมันมาก่อนค่าเริ่มต้นของระบบปฏิบัติการ ดังนั้นในฐานะผู้ใช้ถ้าฉันต้องการเรียกใช้โปรแกรมที่มีLD_LIBRARY_PATHไลบรารี่รุ่นต่าง ๆฉันสามารถรันโปรแกรมด้วยการเก็บตำแหน่งของเวอร์ชันไลบรารี่ที่แตกต่างกันนั้นได้ และในฐานะผู้ดูแลระบบฉันสามารถใส่ไลบรารี่/usr/local/libและลิสต์/usr/local/libในเวอร์ชัน/etc/ld.so.confอื่น

ความน่าเชื่อถือไม่ได้เข้าสู่สิ่งนี้ ไดเรกทอรีใด ๆ ที่ระบุไว้ในพา ธ การค้นหานี้จะต้องเชื่อถือได้เนื่องจากมีไลบรารีใด ๆ ที่สามารถโหลดจากที่นั่นได้ ในทางทฤษฎีคุณสามารถแสดงรายชื่อห้องสมุดที่ใช้โดยโปรแกรมทั้งหมด "ต้องการความไว้วางใจมากขึ้น" ในระบบของคุณและตรวจสอบให้แน่ใจว่าไลบรารีทั้งหมดเหล่านี้มีอยู่ในไดเรกทอรี "น่าเชื่อถือที่สุด" แล้วไดเรกทอรี "เชื่อถือน้อยกว่า" จะไม่ นำมาใช้หากพวกเขามาหลังจากไดเรกทอรีที่เชื่อถือได้มากขึ้นบนเส้นทางการค้นหายกเว้นสำหรับโปรแกรม“ ต้องการความน่าเชื่อถือน้อยกว่า” แต่นั่นจะเปราะบางอย่างยิ่ง มันจะไม่มีจุดหมายสวย ๆ : ถ้าผู้โจมตีสามารถฉีดค่าLD_LIBRARY_PATHหรือองค์ประกอบของ/etc/ld.so.confพวกเขาแน่นอนมีเส้นทางโดยตรงมากขึ้นในการดำเนินการรหัสโดยพลการเช่นการฉีดค่าPATHของLD_PRELOADเป็นต้นความน่าเชื่อถือในเส้นทางโหลดไลบรารีนั้นสำคัญเมื่อการดำเนินการข้ามขอบเขตความน่าเชื่อถือเช่นเมื่อใช้งานโปรแกรมที่มีสิทธิ์เพิ่มเติม (เช่นโปรแกรม setuid / setgid หรือผ่านsudo) สิ่งที่เกิดขึ้นในกรณีนี้คือสิ่งที่LD_LIBRARY_PATHถูกทำให้ว่างเปล่า

สำหรับ/libvs /usr/libมันไม่สำคัญมาก: พวกเขาจัดหาให้โดยเอนทิตีเดียวกัน (ระบบปฏิบัติการ) และไม่ควรมีห้องสมุดที่มีอยู่ในทั้งสอง มันเหมาะสมที่จะแสดงรายการ/libก่อนเพราะมันให้ประโยชน์ด้านประสิทธิภาพ (เล็กมาก): ไลบรารีที่ใช้บ่อยที่สุดโดยเฉพาะไลบรารีที่ใช้โดยโปรแกรมพื้นฐานขนาดเล็ก (ซึ่งเวลาในการโหลดนั้นน้อยกว่าเวลาทำงานทั้งหมดที่สูงกว่าขนาดใหญ่และยาว) โปรแกรม -running) /libตั้งอยู่ใน


หากหลายไดเรกทอรีอยู่ในรายการ LD_LIBRARY_PATH พวกเขาจะค้นหาตามลำดับอะไร
argentum2f

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