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_PRELOAD
ke lintasan objek bersama, file itu akan dimuat sebelum perpustakaan lain (termasuk runtime C, libc.so
). Jadi untuk menjalankan ls
dengan 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_PATH
lebih baik untuk tujuan itu.
Dengan LD_PRELOAD
Anda dapat memberikan prioritas perpustakaan.
Misalnya Anda dapat menulis perpustakaan yang menerapkan malloc
dan free
. Dan dengan memuat ini dengan LD_PRELOAD
Anda malloc
dan free
akan dieksekusi daripada yang standar.
calloc
? bukankah itu mengacaukan segalanya?
malloc
dan gratis dirancang khusus dalam glibc untuk memungkinkan ini dan stok calloc
mengelola panggilan Anda yang diimpor malloc
. Jangan coba ini dengan fungsi lain. Itu tidak akan bekerja dengan baik.
Seperti yang banyak orang sebutkan, gunakan LD_PRELOAD
untuk preload library. BTW, Anda dapat PERIKSA jika pengaturan tersedia dengan ldd
perintah.
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_PRELOAD
daftar pustaka bersama dengan fungsi yang mengesampingkan set standar, sama seperti /etc/ld.so.preload
halnya. 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.so
ke 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/lib
lib lain
untuk dimuat sebelumnya, bahkan ini dapat digunakan dalam program juga
Dengan menggunakan LD_PRELOAD
jalur, 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.