Перезапись файла библиотеки вызывает ошибку сегментации - PullRequest
3 голосов
/ 04 октября 2010

После запуска исполняемого файла я перезаписываю его файл библиотеки .so новой версией, и это приводит к смерти исполняемого файла из-за ошибки сегментации. Я думал, что файл библиотеки доступен только тогда, когда загружен файл ELF. Я не прав?

Ответы [ 2 ]

11 голосов
/ 04 октября 2010

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

Перезапись файла приведет к обновлению страниц из сопоставленного файла MAP_SHARED (который является большинством из них) новым содержимым. Это то, что вызывает ошибки сегментации. Не делайте этого - вместо этого удалите существующий файл .so, затем запишите новый вместо него.

2 голосов
/ 04 октября 2010

Как сказал caf, не рекомендуется перезаписывать исполняемый файл во время его работы.

Вместо этого запишите новые файлы как временный файл в том же каталоге, а затем переименуйте его атомарно с помощью rename (). Это то, что обычно делают установщики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...