#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")
получат новый исполняемый файл).