.o файл - это объектный файл.Это промежуточное представление конечной программы.
В частности, обычно файл .o имеет скомпилированный код, но он не имеет конечных адресов для всех различных подпрограмм или данных.
Одной из вещей, которая нужна программе перед ее запуском, является нечто похожее на образ памяти.
Например.
Если у вас есть основная программа, и она вызывает подпрограмму A.(Это ложный фортран, я не касался десятилетий, так что работайте со мной здесь.)
PROGRAM MAIN
INTEGER X,Y
X = 10
Y = SQUARE(X)
WRITE(*,*) Y
END
Тогда у вас есть функция SQUARE.
FUNCTION SQUARE(N)
SQUARE = N * N
END
Они скомпилированы индивидуальноединицы.Вы можете видеть, что когда MAIN компилируется, он не ЗНАЕТ, где находится "SQUARE", по какому адресу он находится.Нужно знать, что поэтому, когда она вызывает инструкцию JUMP SUBROUTINE (JSR) для микропроцессоров, этой инструкции есть куда пойти.
.o. Файл уже содержит инструкцию JSR, но не имеет фактического значения,Это происходит позже на этапе компоновки или загрузки (в зависимости от вашего приложения).
Итак, файл MAINS .o содержит весь код для main и список ссылок, которые он хочет разрешить (особенно SQUARE).,SQUARE в основном автономен, у него нет ссылок, но в то же время у него еще нет адреса, где он находится в памяти.
Компоновщик удалит все файлы .o иобъединить их в один exe.В старые времена скомпилированный код буквально представлял собой образ памяти.Программа запускалась с какого-то адреса и просто загружалась в ОЗУ оптом, а затем выполнялась.Итак, в этом сценарии вы можете увидеть, как компоновщик берет два файла .o, объединяет их вместе (чтобы получить фактический адрес SQUARE), затем он возвращается и находит ссылку SQUARE в MAIN и заполняет адрес.
Современные компоновщики не заходят так далеко и откладывают большую часть этой окончательной обработки до момента фактической загрузки программы.Но концепция похожа.
Компилируя в файлы .o, вы получаете многократно используемые единицы логики, которые затем объединяются процессами компоновки и загрузки перед выполнением.
Другой приятный моментаспект заключается в том, что файлы .o могут приходить с разных языков.До тех пор, пока вызывающие механизмы совместимы (т. Е. Как аргументы передаются в и из функций и процедур), после компиляции в .o исходный язык становится менее актуальным.Вы можете связать, объединить код C с кодом FORTRAN, скажем.
В PHP и др. Процесс отличается, потому что весь код загружается в одно изображение во время выполнения.Вы можете рассматривать файлы .o на FORTRANs подобно тому, как вы бы использовали механизм включения PHP, чтобы объединить файлы в большое связное целое.