Saya menemukan referensi untuk itu baru-baru ini di proggit dan (seperti yang sekarang) tidak dijelaskan.
Saya curiga ini mungkin, tapi saya tidak tahu pasti.
Saya menemukan referensi untuk itu baru-baru ini di proggit dan (seperti yang sekarang) tidak dijelaskan.
Saya curiga ini mungkin, tapi saya tidak tahu pasti.
Jawaban:
Jika Anda menyetel LD_PRELOADke lintasan objek bersama, file itu akan dimuat sebelum perpustakaan lain (termasuk runtime C, libc.so). Jadi untuk menjalankan lsdengan malloc()implementasi khusus Anda , lakukan ini:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
LD_PRELOAD. Alasannya adalah bahwa itu menjadi variabel lingkungan, itu diwarisi oleh proses anak - yang mungkin memiliki direktori kerja yang berbeda dari proses induk. Jadi setiap jalur relatif akan gagal menemukan perpustakaan untuk dimuat sebelumnya.
Anda bisa mengganti simbol di pustaka stok dengan membuat pustaka dengan simbol yang sama dan menentukan pustaka di LD_PRELOAD.
Beberapa orang menggunakannya untuk menentukan perpustakaan di lokasi yang tidak standar, tetapi LD_LIBRARY_PATHlebih baik untuk tujuan itu.
Dengan LD_PRELOADAnda dapat memberikan prioritas perpustakaan.
Misalnya Anda dapat menulis perpustakaan yang menerapkan mallocdan free. Dan dengan memuat ini dengan LD_PRELOADAnda mallocdan freeakan dieksekusi daripada yang standar.
calloc? bukankah itu mengacaukan segalanya?
mallocdan gratis dirancang khusus dalam glibc untuk memungkinkan ini dan stok callocmengelola panggilan Anda yang diimpor malloc. Jangan coba ini dengan fungsi lain. Itu tidak akan bekerja dengan baik.
Seperti yang banyak orang sebutkan, gunakan LD_PRELOADuntuk preload library. BTW, Anda dapat PERIKSA jika pengaturan tersedia dengan lddperintah.
Contoh: misalkan Anda harus melakukan preload sendiri 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)
Jadi, atur lingkungan preload Anda:
export LD_PRELOAD=/home/patric/libselinux.so.1
Periksa perpustakaan Anda lagi:
>ldd /bin/ls
...
libselinux.so.1 =>
/home/patric/libselinux.so.1 (0x00007fb9245d8000)
...
LD_PRELOADdaftar pustaka bersama dengan fungsi yang mengesampingkan set standar, sama seperti /etc/ld.so.preloadhalnya. Ini diimplementasikan oleh loader /lib/ld-linux.so. Jika Anda ingin menimpa hanya beberapa fungsi yang dipilih, Anda dapat melakukan ini dengan membuat file dan pengaturan objek override LD_PRELOAD; fungsi-fungsi dalam file objek ini akan menimpa hanya fungsi-fungsi yang meninggalkan yang lain.
Untuk informasi lebih lanjut tentang perpustakaan bersama, kunjungi http://tldp.org/HOWTO/Program-Library-HOWTO/ Shared-libraries.html
Berikut ini adalah posting blog terperinci tentang preloading:
mudah diekspor mylib.soke env:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
untuk menonaktifkan:
$ export LD_PRELOAD=
unset LD_PRELOAD
ketika LD_PRELOAD digunakan, file akan dimuat sebelum $export LD_PRELOAD=/path/liblib lain
untuk dimuat sebelumnya, bahkan ini dapat digunakan dalam program juga
Dengan menggunakan LD_PRELOADjalur, Anda dapat memaksa pemuat aplikasi memuat objek yang disediakan bersama, melebihi standar yang disediakan.
Pengembang menggunakan ini untuk men-debug aplikasi mereka dengan menyediakan berbagai versi objek yang dibagikan.
Kami telah menggunakannya untuk meretas aplikasi tertentu, dengan mengesampingkan fungsi yang ada menggunakan objek bersama yang disiapkan.