Вы правы, если dlopen
никогда не вызывается, целевая библиотека никогда не загружается в (память процесса ).
Определение необходимых библиотек без чтения исходного кода похоже на вариант проблемы остановки. Вы можете использовать некоторую эвристику :, если программа не ссылается на libdl
, то она не может использовать dlopen
; если это так, то вы можете использоватьstrace
(см. Как узнать, какие исполняемые файлы динамических библиотек загружаются при запуске?)или попытаться выяснить аргументы dlopen
с помощью статического анализа. Но программа могла включать libdl
напрямую (либо через статическую компоновку,или путем построения кода ); а поскольку динамический компоновщик не волшебство, ничто не мешает программе -реализовать его самостоятельно, так что вы не можете быть абсолютно уверенными, что вы поймали все необходимые библиотеки, используя эти эвристики. Возможно, есть программы, которые понимают, что их отслеживают, и пропускают загрузку библиотеки -...
Единственный надежный способ составить список всех необходимых библиотек — прочитать исходный код.
ответит на мой собственный вопрос, после долгих исследований я наткнулся на проблему с поддержкой активности:https://github.com/acassen/keepalived/issues/836
«systemd -networkd удаляет адреса, которые ему не принадлежат», которые не могут быть обнаружены программой keepalived в версии, поставляемой на Ubuntu или rhel,
решение для меня состоит в том, чтобы создать контейнер поддержки активности с версией 2.0.20, способный справиться с этой ситуацией
(keepalived >= v2 справится с этим)
Другой вариант — попробовать добавить к интерфейсам флаг «критичность»:
network:
version: 2
renderer: networkd
ethernets:
ens192:
addresses: [ 10.100.0.11/16 ]
gateway4: 10.100.0.1
nameservers:
search: [ example.com ]
addresses:
- "10.100.0.21"
- "10.100.0.22"
critical: true
ens224:
addresses: [ 10.0.0.11/16 ]
nameservers:
search: [ example.com ]
addresses:
- "10.100.0.21"
- "10.100.0.22"
critical: true