Czy można użyć kodu samomodyfikującego do przyspieszenia wywoływania funkcji w dynamicznie połączonych bibliotekach?
O ile rozumiem, biblioteki współdzielone ELF używają pewnego rodzaju pośredniej tablicy skoków (tabela łączenia procedur lub PLT), aby umożliwić leniwe wiązanie funkcji bibliotecznych. Wydaje się, że celem jest uniknięcie konieczności modyfikowania tabeli w segmencie kodu, jednocześnie umożliwiając leniwe rozwiązywanie pozycji funkcji przy pierwszym wywołaniu.
Czy nie byłoby szybciej dynamicznie tworzyć kodu dla tej tabeli w czasie ładowania, a może nawet przy pierwszym wywołaniu funkcji?
Czy ma to umożliwić udostępnianie segmentu kodu między procesami w jak największym stopniu (dynamiczna tabela byłaby prywatna dla procesu)? Czy to ze względów bezpieczeństwa (kod do zapisu nie powinien być wykonywalny - ale JIT robią to cały czas, a moduł ładujący może dodawać i usuwać uprawnienia przed uruchomieniem programu)?
A może jest to kombinacja tych działań, a niewielki wzrost wydajności na wywołanie funkcji po prostu nie byłby wart wysiłku?
OSD ELF mogą użyć flagi (DF_TEXREL), aby ogłosić, że wymagają ponownego przydzielenia poprzez zmianę sekcji tekstowej (która zwykle jest tylko do odczytu). Podejście do tabeli skoków wraz z kodem niezależnym od pozycji PIE powinny być jednak bardziej optymalne.
(Znaleziono to w http://www.akkadia.org/drepper/dsohowto.pdf , ale inne zasoby również o tym wspominają).
źródło