что случилось бы, если бы я изменил C ++ Dynamic Shared Library в Linux, в то время как моя исполняемая программа использовала его - PullRequest
3 голосов
/ 19 сентября 2019

У меня есть динамическая разделяемая библиотека C ++ abc.so в Linux, и моя исполняемая программа динамически загружает ее dlopen, а затем закрывает abc.so новой версией, используя rm + cp в случае изменения inode использования abc.so, но иногда есть coredump, я понимаю, что это может быть связано с задержкой загрузки динамической разделяемой библиотеки, но я не могу это подтвердить, кто-нибудь может помочь мне выяснить, почему?большое спасибо!

1 Ответ

3 голосов
/ 19 сентября 2019

Без возможности исследовать это самостоятельно, это становится умозрительным, но использование:

rm abc.so
cp new_version.so abc.so

не влияет на программы, которые уже загрузили abc.so.Для программ, связанных с abc.so (или использующих dlopen для загрузки), это будет представлять проблему, если они запускаются (или используют dlopen) во время удаления файла или его копирования на место.Результатом вполне может быть дамп ядра.

Лучший способ заменить ваш abc.so:

copy new_version.so to the same filesystem as abc.so (like the same directory)
mv new_version.so abc.so

Это гарантирует, что всегда есть полная версия abc.so, где онаОжидается, что будет.Любая программа, нуждающаяся в ней, получит либо старую версию , либо новую версию - и между ними ничего нет.

...