Son zamanlarda proggit üzerinde bir referans geldi ve (şu andan itibaren) açıklanmıyor.
Sanıyorum bu o olabilir, ama emin değiliz.
Son zamanlarda proggit üzerinde bir referans geldi ve (şu andan itibaren) açıklanmıyor.
Sanıyorum bu o olabilir, ama emin değiliz.
Yanıtlar:
LD_PRELOAD
Paylaşılan bir nesnenin yolunu ayarlarsanız , bu dosya diğer kitaplıklardan (C çalışma zamanı dahil) önce yüklenir libc.so
. ls
Özel malloc()
uygulamanızla çalıştırmak için şunu yapın :
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
LD_PRELOAD
. Bunun nedeni, bir ortam değişkeni olması, üst süreçten farklı bir çalışma dizinine sahip olabilecek alt süreçler tarafından miras alınmasıdır. Bu nedenle, göreceli herhangi bir yol önceden yüklenecek kitaplığı bulamaz.
Aynı sembollere sahip bir kütüphane oluşturarak ve içindeki kütüphaneyi belirterek stok kütüphanelerindeki sembolleri geçersiz kılabilirsiniz LD_PRELOAD
.
Bazı insanlar standart olmayan yerlerde kütüphaneleri belirtmek için kullanır, ancak LD_LIBRARY_PATH
bu amaç için daha iyidir.
İle LD_PRELOAD
size kütüphaneler öncelik verebilir.
Örneğin, malloc
ve uygulayan bir kütüphane yazabilirsiniz free
. Ve tarafından bu yükleme LD_PRELOAD
SİZİN malloc
ve free
standart olanlardan daha ziyade çalıştırılacaktır.
calloc
? bu her şeyi mahvetmez miydi?
malloc
Ücretsiz ve ücretsiz olarak glibc'de buna izin vermek için özel olarak tasarlandığı ortaya çıkıyor ve hisse senedi calloc
içe aktarılanınızı aramayı başarıyor malloc
. Bunu başka işlevlerle denemeyin. O kadar iyi çalışmayacak.
Birçok kişinin belirttiği gibi, LD_PRELOAD
kütüphaneyi önceden yüklemek için kullanıyor . BTW, ayarın komutla kullanılabilir olup olmadığını KONTROL EDİN ldd
.
Örnek: kendi yüklemenizi yapmanız gerektiğini varsayalım 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)
Böylece, önyükleme ortamınızı ayarlayın:
export LD_PRELOAD=/home/patric/libselinux.so.1
Kütüphanenizi tekrar kontrol edin:
>ldd /bin/ls
...
libselinux.so.1 =>
/home/patric/libselinux.so.1 (0x00007fb9245d8000)
...
LD_PRELOAD
Tıpkı standart kümeyi geçersiz kılan işlevlere sahip paylaşılan kitaplıkları listeler /etc/ld.so.preload
. Bunlar yükleyici tarafından uygulanır /lib/ld-linux.so
. Sadece birkaç seçilen işlevi geçersiz kılmak istiyorsanız, bunu geçersiz kılan bir nesne dosyası ve ayar oluşturarak yapabilirsiniz LD_PRELOAD
; bu nesne dosyasındaki işlevler yalnızca diğerlerini oldukları gibi bırakan işlevleri geçersiz kılar.
Paylaşılan kütüphaneler hakkında daha fazla bilgi için http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html adresini ziyaret edin.
İşte önyükleme hakkında ayrıntılı bir blog yazısı:
mylib.so
env'ye dışa aktarmak kolaydır :
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
devre dışı bırakmak için:
$ export LD_PRELOAD=
unset LD_PRELOAD
LD_PRELOAD kullanıldığında, bu dosya $export LD_PRELOAD=/path/lib
önceden yüklenecek diğer herhangi bir lib'den önce
yüklenir, hatta bu programlarda da kullanılabilir
LD_PRELOAD
Yolu kullanarak , uygulama yükleyiciyi sağlanan varsayılan nesneyi sağlanan varsayılan nesneyi yüklemeye zorlayabilirsiniz.
Geliştiriciler, paylaşılan nesnelerin farklı sürümlerini sağlayarak uygulamalarında hata ayıklamak için bunu kullanır.
Hazır paylaşılan nesneleri kullanarak mevcut işlevleri geçersiz kılarak belirli uygulamaları kesmek için kullandık.