Я намагаюся дізнатися більше про версію бібліотеки в 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розкрийте прапори у вашій програмі. Я не маю часу перевірити це зараз, але це має працювати на основі сторінки.