Ответ 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 это гарантировано. Однако это не обязательно распространяется на другие линкеры.