Повторяющиеся символы в динамической библиотеке загружаются из другой динамической библиотеки - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть ситуация, когда у меня есть две общие библиотеки, назовем их libA.so и libB.so.libA.so загружается через dlopen () и использует синглтон.libA.so в какой-то момент загружает libB.so через dlopen (), который также использует тот же синглтон.К сожалению, динамический компоновщик не может объединить эти одноэлементные символы в один, и в результате получается два одноэлементных экземпляра.

Когда такая ситуация возникает с исполняемым файлом и динамически загружаемой библиотекой, я знаю, что обычным решением является добавление:динамическая при связывании исполняемого файла.Это не работает здесь.Символ в обеих библиотеках экспортируется как V, и я не знаю, что делать, чтобы динамический компоновщик объединял их вместе.

РЕДАКТИРОВАТЬ: это было протестировано на Android и, похоже, специфично для Android,а не общий.

1 Ответ

0 голосов
/ 21 сентября 2018

libA.so загружается через dlopen () и использует синглтон.libA.so в какой-то момент загружает libB.so через dlopen (), который также использует тот же синглтон.К сожалению, динамический компоновщик не может объединить эти одноэлементные символы в один, и в результате получается два одноэлементных экземпляра.

Я могу воспроизвести это на тривиальном примере, но только если загрузка libA.so использует флаг RTLD_LOCAL.Если я использую RTLD_GLOBAL, то переменная, совместно используемая между libA.so и libB.so, будет преобразована в первый загруженный экземпляр (внутри libA.so).

Я считаю, что это работает так, как задумано.

...