У меня есть программа, которая связана с (общей) библиотекой libFoo.so. Теперь мне нужно было написать исправленную версию этой библиотеки. Назовите его libFooPatch, хотя имя будет тоже libFoo.so. Этот определяет дополнительный слабый символ Init.
Первый сценарий (только для пояснения):
Теперь предположим, что я бы реализовал «Init» в программе. Во время выполнения libFooPatch загружается через LD_LIBRARY_PATH.
Если программа была связана с libFoo, вызов «Init» из libFooPatch заставляет ее вызывать только версию со слабой ссылкой, а не версию из программы. Связывание его с libFooPatch исправляет это и работает без проблем.
1) Но почему это так? Разве во время выполнения не вызывается сильная ссылка «Init» из программы?
Теперь настоящая проблема (2-й сценарий):
Я не могу изменить саму программу. Он не определяет «Init» и связан с libFoo. Я могу изменить libFooPatch, который по-прежнему вместо libFoo, поместив его в LD_LIBRARY_PATH.
Я хочу написать (разделяемую) библиотеку libBar, которая используется в программе (скорее всего, dlopen), определяет «Init» как сильный символ и заставляет libFooPatch вызывать этот.
Однако я не могу заставить его работать. Моя собственная функция Init никогда не вызывается, и даже получение указателя в libBar дает мне только слабую из libFooPatch.
«nm libBar.so» возвращает «0000000000000eb0 T Init», так что оно там правильно определено, не так ли?
Любые указатели, как я могу заставить это работать?
Задача ещё не решена.
Других решений пока нет …