ELF berbagi perpustakaan - motivasi untuk PLT

11

Bisakah kode modifikasi diri digunakan untuk mempercepat pemanggilan fungsi di pustaka yang terhubung secara dinamis?

Sejauh yang saya pahami, pustaka bersama ELF menggunakan semacam tabel lompat tidak langsung (tabel tautan prosedur, atau PLT) untuk mengaktifkan fungsi perpustakaan yang mengikat secara malas. Tujuannya tampaknya untuk menghindari keharusan memodifikasi tabel di segmen kode sambil tetap mengaktifkan resolusi malas posisi fungsi pada panggilan pertama.

Bukankah lebih cepat untuk secara dinamis membuat kode untuk tabel itu pada waktu buka, atau mungkin bahkan pada panggilan fungsi pertama?

Apakah ini untuk memungkinkan pembagian segmen kode antara proses sebanyak mungkin (tabel dinamis akan bersifat pribadi untuk suatu proses)? Apakah ini untuk alasan keamanan (kode yang dapat ditulis seharusnya tidak dapat dieksekusi - tetapi JIT selalu melakukannya, dan izin menulis dapat ditambahkan dan dihapus oleh loader sebelum benar-benar memulai program)?

Atau itu kombinasi dari semuanya, dan perolehan kinerja kecil per panggilan fungsi tidak akan sepadan dengan usaha?

lxgr
sumber

Jawaban:

8

Saya kira kita sedang berbicara tentang arsitektur x86.

Anda tidak dapat memiliki Kode Pengubah Mandiri dalam mode terproteksi , yang digunakan oleh sebagian besar sistem operasi berbasis UNIX (dan tidak hanya) yang saya ketahui, karena segmen kode selalu hanya-baca. Loader tidak mengontrol bahwa -itu adalah sesuatu yang sedang ditangani oleh subsistem manajemen memori dari kernel.

Tetapi bahkan jika Anda bisa "membuat kode untuk tabel itu pada waktu buka" seperti yang Anda katakan, itu akan menentang seluruh tujuan perpustakaan bersama. Dengan cara ini, setiap proses akan memiliki salinan "pribadi" fungsi perpustakaan di ruang alamatnya, secara efektif meningkatkan jejak ingatannya - salah satu alasan mengapa perpustakaan bersama dibuat, adalah untuk mengatasi masalah ini.

Seluruh proses yang Anda jelaskan cukup rumit, dan akan membutuhkan siklus pemrosesan lebih banyak daripada metode PLT yang digunakan saat ini, dan mungkin akan memperkenalkan lebih banyak, masalah keamanan baru & menarik.

dkaragasidis
sumber
2
Anda dapat menggunakan system call mprotect (2) untuk membuat halaman segmen .text dapat ditulis dan dieksekusi.
Bruce Ediger
1
Itu benar, tuan. Mungkin ini akan bekerja dengan baik pada sistem berbasis UNIX rata-rata, tetapi seluruh proses penautan akan pecah segera setelah seseorang mencoba mengeraskan sistem dengan misalnya PaX, yang memberlakukan pembatasan pada mprotect (2).
dkaragasidis
(Sepertinya saya tidak menyebutkan @BruceEdiger dalam komentar saya sebelumnya)
dkaragasidis
1

ELF DSO dapat menggunakan bendera (DF_TEXREL) untuk mengumumkan bahwa mereka memerlukan pemindahan lokasi dengan memodifikasi bagian teks mereka (yang biasanya hanya baca). Pendekatan tabel lompat bersama dengan kode independen posisi PIE harus lebih optimal.

(Ditemukan di http://www.akkadia.org/drepper/dsohowto.pdf , tetapi sumber daya lain menyebutkan ini juga).

PSkocik
sumber