shim bibliotekę z wersjonowanymi symbolami

1

W przypadku biblioteki ładowanej przez obiekt współdzielony, w jaki sposób zezwolić na rozwiązywanie symboli w wersji przez plik wykonywalny?

Istnieje zastrzeżona biblioteka używana przez wiele plików wykonywalnych w systemie, która zawiera błąd w jednej procedurze, którą musimy załatać w całym systemie. To sprawia, że ​​coś w rodzaju LD_PRELOAD jest niewygodne i niepraktyczne, aby próbować wtargnąć do każdego środowiska, z którego mogą być uruchamiane pliki wykonywalne. Tak więc otrzymałem plan kopiowania powiedz libspecial.sodo libspecial.so.orgi utworzenia nowej biblioteki o nazwie, libspecial.soktóra przesłania tę jedną funkcję i jest połączona, libspecial.so.orgaby umożliwić automatyczne ładowanie wszystkich pozostałych symboli.

W małym teście z małą przykładową biblioteką działało to dobrze.
Jedna funkcja jest zastępowana, a wszystkie pozostałe symbole w oryginalnej bibliotece są dostępne dla głównego pliku wykonywalnego w sposób transparentny.

Jednak biblioteka, o której mowa, ma kilka symboli wersji. Z jakiegoś powodu informacje te nie są przekazywane, a plik wykonywalny skarży się (no cóż, linker czasu wykonywania), że nie może wyszukać potrzebnych informacji o wersji.

Jak mogę pozwolić, aby symbole wersjonowane były rozwiązywane przez plik wykonywalny?
Może jeśli jawnie załaduję bibliotekę dlopen, czy są jakieś specjalne flagi, które na to pozwalają?
Czy jest łatwiejszy sposób?

Kolega zasugerował, że moglibyśmy usunąć wszystkie potrzebne informacje o wersji z wykonywalnych struktur ELF, które wypróbowaliśmy i to działa. Ale potem muszę zmienić wszystkie pliki wykonywalne, i jest też obawa, że ​​może to coś zepsuć, więc wydaje się zbyt ryzykowne. Ponieważ linker czasu wykonywania może poradzić sobie z rozwiązywaniem symboli i po prostu rozłącza się podczas przekazywania informacji o wersji, mam nadzieję, że po prostu brakuje mi sposobu, aby łatwo poradzić sobie z tym w bibliotece.

BuddyJohn
źródło
Nie wiedziałem o dlmopen (). Wraz z LM_ID_BASE brzmi to dokładnie tak, jak chcę. Jednak to też nie działa. Naprawdę nie rozumiem dlaczego. Mam wrażenie, że istnieje większa lekcja na temat szczegółów łączenia w czasie wykonywania, której muszę się tutaj nauczyć.
BuddyJohn 30.09.16