ฉันเจอการอ้างอิงถึงมันเมื่อเร็ว ๆ นี้ในproggitและ (ณ ตอนนี้) มันไม่ได้อธิบาย
ฉันสงสัยว่ามันอาจเป็นไปได้ แต่ฉันไม่รู้แน่นอน
ฉันเจอการอ้างอิงถึงมันเมื่อเร็ว ๆ นี้ในproggitและ (ณ ตอนนี้) มันไม่ได้อธิบาย
ฉันสงสัยว่ามันอาจเป็นไปได้ แต่ฉันไม่รู้แน่นอน
คำตอบ:
หากคุณตั้งค่าLD_PRELOADเป็นพา ธ ของวัตถุที่ใช้ร่วมกันไฟล์นั้นจะถูกโหลดก่อนไลบรารีอื่น ๆ (รวมถึง C runtime libc.so) ดังนั้นในการรันlsด้วยmalloc()การติดตั้งแบบพิเศษให้ทำดังนี้
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
LD_PRELOADเส้นทางไปยัง เหตุผลก็คือมันเป็นตัวแปรสภาพแวดล้อม แต่สืบทอดโดยกระบวนการลูก - ซึ่งอาจมีไดเรกทอรีทำงานแตกต่างจากกระบวนการหลัก ดังนั้นเส้นทางสัมพัทธ์ใด ๆ จะล้มเหลวในการค้นหาไลบรารีเพื่อโหลดล่วงหน้า
LD_PRELOADคุณสามารถแทนที่สัญลักษณ์หุ้นในห้องสมุดโดยการสร้างห้องสมุดที่มีสัญลักษณ์เดียวกันและระบุห้องสมุดใน
บางคนใช้เพื่อระบุไลบรารีในตำแหน่งที่ตั้งที่ไม่เป็นมาตรฐาน แต่LD_LIBRARY_PATHดีกว่าสำหรับจุดประสงค์นั้น
ด้วยLD_PRELOADคุณสามารถให้ความสำคัญกับห้องสมุด
ตัวอย่างเช่นคุณสามารถเขียนห้องสมุดที่ใช้และmalloc freeและโดยการโหลดสิ่งเหล่านี้กับLD_PRELOADคุณmallocและfreeจะถูกประหารชีวิตแทนที่จะเป็นแบบมาตรฐาน
calloc? มันจะไม่เลอะทุกอย่างเหรอ?
mallocและฟรีได้รับการออกแบบมาโดยเฉพาะใน glibc ที่จะอนุญาตให้นี้และสต็อกพอที่จะเรียกที่นำเข้าcalloc mallocอย่าลองด้วยฟังก์ชั่นอื่น ๆ มันทำงานได้ไม่ดีนัก
ดังที่หลายคนพูดถึงการใช้LD_PRELOADโหลดไลบรารีล่วงหน้า BTW คุณสามารถตรวจสอบหากการตั้งค่าสามารถใช้ได้โดยlddคำสั่ง
ตัวอย่าง: libselinux.so.1สมมติว่าคุณจำเป็นต้องโหลดของคุณเอง
> ldd /bin/ls
...
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3927b1d000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f3927914000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f392754f000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3927311000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f392710c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3927d65000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f3926f07000)
ดังนั้นตั้งค่าสภาพแวดล้อมพรีโหลดของคุณ:
export LD_PRELOAD=/home/patric/libselinux.so.1
ตรวจสอบห้องสมุดของคุณอีกครั้ง:
>ldd /bin/ls
...
libselinux.so.1 =>
/home/patric/libselinux.so.1 (0x00007fb9245d8000)
...
LD_PRELOADรายการห้องสมุดสาธารณะที่มีฟังก์ชั่นที่แทนที่ชุดมาตรฐานเช่นเดียวกับที่/etc/ld.so.preloadไม่ /lib/ld-linux.soเหล่านี้จะถูกนำมาใช้โดยโหลด หากคุณต้องการที่จะแทนที่เพียงฟังก์ชั่นที่เลือกไม่กี่คุณสามารถทำเช่นนี้โดยการสร้างไฟล์วัตถุเอาชนะและการตั้งค่าLD_PRELOAD; ฟังก์ชั่นในไฟล์วัตถุนี้จะแทนที่เพียงฟังก์ชั่นเหล่านั้นออกจากคนอื่น ๆ เช่นที่พวกเขา
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับห้องสมุดสาธารณะให้ไปที่ http://tldp.org/HOWTO/Program-Library-HOWTO/shared-library.html
นี่คือโพสต์บล็อกโดยละเอียดเกี่ยวกับการโหลดล่วงหน้า:
มันง่ายที่จะส่งออกmylib.soไปยัง env:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
ปิดการใช้งาน:
$ export LD_PRELOAD=
unset LD_PRELOAD
เมื่อ LD_PRELOAD ถูกใช้ไฟล์นั้นจะถูกโหลดก่อนที่$export LD_PRELOAD=/path/liblib อื่น ๆ
จะถูกโหลดไว้ล่วงหน้าแม้จะสามารถใช้ในโปรแกรมได้เช่นกัน
การใช้LD_PRELOADพา ธ คุณสามารถบังคับให้โหลดเดอร์ของแอปพลิเคชันให้วัตถุที่ใช้ร่วมกันผ่านค่าเริ่มต้นที่ให้ไว้
นักพัฒนาใช้สิ่งนี้เพื่อดีบักแอปพลิเคชันของพวกเขาโดยจัดเตรียมวัตถุที่ใช้ร่วมกันรุ่นต่างๆ
เราใช้มันเพื่อแฮ็กแอปพลิเคชันบางอย่างโดยการแทนที่ฟังก์ชั่นที่มีอยู่โดยใช้วัตถุที่ใช้ร่วมกันที่เตรียมไว้