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
-вывести базовую строку в файл Проблема не в том, что динамический компоновщик не может разрешить 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
и т. д., которые раскрывают проблему.