Я намагаюся дізнатися більше про версію бібліотеки в Linux і про те, як все це працювати. Ось контекст:
- У мене є дві версії динамічної бібліотеки, які розкривають один і той же набір інтерфейсів, скажімо, libsome1.so
і libsome2.so
.
- Програма пов’язана проти libsome1.so
.
- libdl.so
Скажімо, ця програма використовує для динамічного завантаження іншого модуля libmagic.so
.
- Зараз libmagic.so
пов’язаний проти libsome2.so
. Очевидно, що без використання скриптів посилання для приховування символів у libmagic.so
, під час виконання всі виклики до інтерфейсів libsome2.so
вирішені libsome1.so
. Це можна підтвердити, перевіривши повернене значення libVersion()
проти значення макроса LIB_VERSION
.
- Тому я намагаюся поруч компілювати та зв’язуватись libmagic.so
із скриптом посилання, який приховує всі символи, крім 3, які визначені у libmagic.so
та експортуються ним. Це працює ... Або принаймні libVersion()
і LIB_VERSION
значення відповідають (і він повідомляє версію 2, а не 1).
- Однак, коли деякі структури даних серіалізуються на диск, я помітив деяку корупцію. У каталозі програми, якщо я видаляю libsome1.so
і створюю на його місці м'яке посилання, на яке вказують libsome2.so
, все працює як очікувалося, і така ж корупція не трапляється.
Я не можу не думати, що це може бути викликано певним конфліктом у роздільній здатності символів, які виконують час роботи. Я пробував багато речей, як, наприклад, намагаюся зв’язати libsome2.so
так, щоб усі символи були впорядковані symbol@@VER_2
( до чого я все ще плутаю, оскільки команда nm -CD libsome2.so
все ще перераховує символи як symbol
і ні symbol@@VER_2
) ... Ніщо, здається, не працює !!! Допоможіть !!!!!!
RTLD_LOCAL
і RTLD_DEEPBIND
розкрийте прапори у вашій програмі. Я не маю часу перевірити це зараз, але це має працювати на основі сторінки.