ELF paylaşılan kütüphaneleri - PLT için motivasyon


11

Kendi kendini değiştiren kod, dinamik olarak bağlı kütüphanelerde fonksiyon çağrısını hızlandırmak için kullanılabilir mi?

Anladığım kadarıyla, ELF paylaşılan kütüphaneleri , kütüphane fonksiyonlarının tembel bağlanmasını sağlamak için bir tür dolaylı atlama tablosu (prosedür bağlantı tablosu veya PLT) kullanır. Amaç, ilk çağrıda işlev konumlarının tembel çözümlenmesini sağlarken kod segmentindeki tabloyu değiştirmekten kaçınmak gibi görünmektedir.

Yükleme sırasında ve hatta muhtemelen ilk işlev çağrısında bu tablo için kodu dinamik olarak oluşturmak daha hızlı olmaz mıydı?

Kod segmentinin süreçler arasında olabildiğince paylaşılmasını sağlamak mı (dinamik bir tablo bir süreç için özel olacaktır)? Güvenlik nedeniyle mi (yazılabilir kod çalıştırılabilir olmamalıdır - ancak JIT'ler bunu her zaman yapar ve yazma izni , programı başlatmadan önce yükleyici tarafından eklenebilir ve kaldırılabilir )?

Yoksa bunların bir kombinasyonu mu ve işlev çağrısı başına küçük performans kazancı çabaya değmez mi?

Yanıtlar:


8

Sanırım x86 mimarisinden bahsediyoruz.

Kod bölümleri her zaman salt okunur olduğundan, UNIX tabanlı çoğu işletim sistemi (ve yalnızca değil) tarafından kullanılan korumalı modda Kendi Kendini Değiştiren Kod'a sahip olamazsınız . Bir yükleyici, -it'in çekirdeğin bellek yönetimi alt sistemi tarafından ele alınan bir şey olduğunu kontrol etmez.

Ama dediğin gibi "yükleme sırasında bu tablo için kod oluşturabilir" olsanız bile, paylaşılan kütüphanelerin tüm amacına meydan okuyacaktır. Bu şekilde, her işlemin adres alanındaki kütüphanenin işlevlerinin "özel" bir kopyası olur, bu da paylaşılan kütüphanelerin oluşturulmasının nedenlerinden biri olan bellek ayak izini etkili bir şekilde arttırır.

Açıkladığınız tüm süreç oldukça karmaşıktır ve günümüzde kullanılan PLT yönteminden daha fazla işlem döngüsüne mal olacak ve muhtemelen daha yeni ve ilginç güvenlik sorunları getirecektir.


2
.Prode segment sayfalarını yazılabilir ve yürütülebilir yapmak için mprotect (2) sistem çağrısını kullanabilirsiniz.
Bruce Ediger

1
Bu doğru, efendim. Muhtemelen ortalama UNIX tabanlı sistemde iyi çalışacaktır, ancak birileri mprotect (2) üzerindeki kısıtlamaları uygulayan PaX ile sistemi sertleştirmeye çalıştığında tüm bağlantı süreci kırılacaktır (2).
dkaragasidis

(Önceki yorumumda @BruceEdiger'den bahsetmeyi özledim)
dkaragasidis

1

ELF DSO'ları, metin bölümlerini (normalde salt okunur olan) değiştirerek çıkmalara ihtiyaç duyduklarını bildirmek için bir bayrak (DF_TEXREL) kullanabilir. Ancak PIE pozisyonundan bağımsız kodla birlikte atlama tablosu yaklaşımı daha uygun olmalıdır.

(Bunu http://www.akkadia.org/drepper/dsohowto.pdf adresinde buldum , ancak diğer kaynaklar da bunu belirtti).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.