Редактирование исходного кода во время выполнения программы

#c #unix #gcc #compilation

#c #unix #gcc #Сборник

Вопрос:

У меня есть программа на C, которая вызывает несколько функций из разных файлов, и при компиляции я связываю все объектные файлы вместе, чтобы создать двоичный файл. Затем я запускаю выполнение программы. Теперь я хотел бы отредактировать исходный код различных файлов и скомпилировать новые версии. Это перезапишет старый объект и двоичные файлы.

Повлияет ли это на выполнение текущей программы? Теперь он будет связывать новые объектные файлы? Если я перезапишу запускаемый двоичный файл, приведет ли это к остановке выполнения или повлияет на него каким-либо другим способом? Или код хранится в таком месте, где его нельзя перезаписать в начале выполнения?

Я использую gcc для компиляции своего кода.

Ответ №1:

В Unix разрешение gcc заменить исполняемый файл не окажет никакого влияния на запущенную программу.

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

Комментарии:

1. Если бы я использовал функцию ‘system’ для вызова внешней программы, то повлияло бы редактирование этой программы во время выполнения на выполнение программы?

2. @JTS: Извините, но я изо всех сил пытаюсь понять ваш вопрос. Чего вы пытаетесь достичь?

3. Извините, позвольте мне сделать это более понятным. У меня есть исполняемый файл ‘foo’ и программа на c ‘bar.c’, а внутри ‘bar.c’ я вызываю ‘system(«./foo»);’. Я компилирую и запускаю ‘bar.c’. Если я сейчас перезапишу ‘foo’, повлияет ли это на выполнение ‘bar’?

4. @JTS: Нет, этого не произойдет (но любые последующие вызовы system("./foo") получат новый исполняемый файл).