Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

Компоновка, компиляция [закрыт]

#c #компиляция


        
             
                
                    
                        
                            Закрыт. Данный вопрос необходимо конкретизировать. Ответы
на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он был сосредоточен только на одной проблеме, отредактировав его.
                        
                        Закрыт 4 года назад.
                                                                                
           
                
        
Можно объяснить, что такое препроцессор, компиляция, линковщик, как происходит сборка
файлов, пошаговые этапы?
    


Ответы

Ответ 1



Очень коротко. Препроцессор делает текстовые преобразования исходного .c файла (в т.ч. вставляет текст из #include) и результат передается на вход компилятору. Компилятор преобразует свой вход (программу на языке Си) в объектный файл (.o), который содержит константы, машинные команды и таблицу внешних символов (переменные и функции к которым обращается этот исходный код, но которые в нем не определены). Линковщик (редактор связей) на основе результатов компилятора (.o файлы) и известных ему библиотек (по сути это те же .о файлы, но специальным образом скомпонованные) создает исполняемый файл (в винде .exe) или разделяемую библиотеку (в винде .dll, в *nix .so). При этом происходит так называемое разрешение внешних имен, т.е. ранее известные только по именам функции и внешние переменные обретают адреса и в соответствии с этим меняется код объектного файла (сами .o, естественно, не изменяются). Системный загрузчик (часть ядра ОС) читает исполняемый файл в память и проводит окончательную настройку адресов (если требуется), а также связывает этот машинный код с кодом в системных разделяемых библиотеках (они общие для всех программ в системе и их часто используемые части обычно уже подкачаны в память к моменту загрузки Вашей программы). Вопросы виртуальной памяти (преобразование виртуальных адресов в физические) я тут не рассматривал.

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

Отправить комментарий