Почему динамическому компоновщику не удалось разрешить ссылку, когда общая библиотека зависит от другой общей библиотеки?

awkрешение:

awk '/^===/{ fn=substr($NF,2,length($NF)-3) }{ print > fn }' file

Каждому файлу будет присвоено имя в соответствии с именем хоста(SERVERNAME<number>)

  • /^===/-на линии пересечения, начинающейся с===

  • fn=substr($NF,2,length($NF)-3)-создание имени файла fn,substr($NF,2,length($NF)-3)-будет извлекать имя хоста, игнорируя круглые скобки вокруг него($NF-последнее поле)

  • print > fn-вывести базовую строку в файл
0
27.12.2020, 12:36
1 ответ

Проблема не в том, что динамический компоновщик не может разрешить function_b, а в том, что ваш второй вызов dlopenневерен:вам нужно включить либо RTLD_LAZY, либо RTLD_NOW, остальные флаги дополняют эти два.

One of the following two values must be included in flags:

Изменение загрузки b.soна

handle_b = dlopen("./b.so", RTLD_NOW | RTLD_GLOBAL);

создает рабочую программу.

Каждый вызов dlopenдолжен выбирать между RTLD_LAZYи RTLD_NOW; поскольку b.soзагружается последней библиотекой, я указал NOWвыше (, мы ничего не выиграем от ленивой -загрузки ), но LAZYработает в этом случае так же хорошо. Кроме того, могут быть добавлены другие флаги; здесь нам нужен RTLD_GLOBAL, потому что нам нужно, чтобы символы b.soбыли доступны глобально, чтобы function_aмог найти function_bпри запуске.

См. примеры вdlopen(3)для получения подробной информации об обработке ошибок -, которые вам необходимо выполнить с dlopenи т. д., которые раскрывают проблему.

2
18.03.2021, 23:07

Теги

Похожие вопросы