Компиляция программы во время ее запуска

У меня есть широкий вопрос:

Предположим, что у меня есть программа на С++, и я начал запускать ее в фоновом режиме с некоторой конфигурацией, которая может быть установлена ​​внутри. Пока он работал, я изменил эти внутренние конфигурации, скомпилировал его и начал запускать его в другом файле.

Это повлияет на предыдущий экземпляр, который уже был запущен в фоновом режиме? или, поскольку он уже был запущен, это не будет? Любые идеи по этому поводу приветствуются.

Ответы

Ответ 1

Невозможно изменить исполняемый файл, который запущен. Как Что происходит, если вы перезаписываете исполняемый файл с отображением памяти?

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

Если вы удалите файл и скомпилируете новую версию программы, то что будет очень хорошо определено. В уже запущенном экземпляре будет использоваться предыдущий код, который будет храниться в памяти операционной системой до тех пор, пока программа не завершится. Любые новые экземпляры будут использовать новый код.

Резюме: вы должны убедиться, что ваша система сборки удаляет старый исполняемый файл перед повторной компиляцией, и пока это правда, перекомпиляция не вступает в силу до повторного запуска программы, в противном случае поведение undefined (чтение SIGSEGV).

Приложение сорта:

Джеймс Канзе справедливо указал, что сам компоновщик может удалить файл перед записью своего вывода, если это так, тогда он всегда будет вести себя так, как будто вы удалили файл перед повторной компиляцией (разумный сценарий). Глядя на bfd/cache.c из заголовка binutils cvs:
/* Create the file.

   Some operating systems won't let us overwrite a running
   binary.  For them, we want to unlink the file first.

   However, gcc 2.95 will create temporary files using
   O_EXCL and tight permissions to prevent other users from
   substituting other .o files during the compilation.  gcc
   will then tell the assembler to use the newly created
   file as an output file.  If we unlink the file here, we
   open a brief window when another user could still
   substitute a file.

   So we unlink the output file if and only if it has
   non-zero size.  */

Итак, по крайней мере, с GNU LD это гарантировано. Однако это не обязательно распространяется на другие линкеры.

Ответ 2

Что может/произойдет, зависит от ОС, но в целом ваша старая программа никогда не начнет работать с новым кодом. Я говорю, что это зависит от ОС, поскольку в Windows я полагаю, что файл будет заблокирован, и вы просто не сможете его перезаписать, тогда как в Linux вы обязательно отсоедините старый файл, но программа по-прежнему будет использовать эту старую версию, а ваша новая версия технически будет другим файлом.

Теперь здесь есть оговорка. Если у вас есть динамические библиотеки или другие ресурсы динамического кода, вы можете получить новую версию. В любом случае вы загружаете библиотеку по требованию, которую вы загружаете, будет той, которая существует во время загрузки. В большинстве случаев все библиотеки загружаются непосредственно в начале программы. Однако одним распространенным случаем, когда они не являются, является архитектура плагина, где они загружаются по мере необходимости.

Ответ 3

Нет, это не повлияет на исходный исполняемый экземпляр - который уже загружен в память и не будет изменен.