Введение в Unix

Линкер


На практике программы создаются из множества раздельно транслируемых модулей, каждый из которых занимает отдельный файл. Результатом компиляции каждого модуля является файл объектного (перемещяемого) кода, имя которого получается заменой .c (или .f, .p и т.д.) на .c. Затем все объектные файлы объединяются в единую программу, помещаемую в файл исполняемого кода, посредством линкера. Линкер может вызываться как независимой командой ld, так и автоматически при выполнении команд вызова компилятора cc, fc, pc и т.д. В последнем случае эти команды могут иметь несколько параметров-файлов, имена которых могут оканчиваться не только на .c, .f, .p, ..., но и на .o. Файлы исходного текста компилируются, а затем все файлы объектного кода, как полученные в результате компиляции, так и параметры команды вызова компилятора, передаются линкеру. Результатом по-прежнему является файл с именем по умолчанию a.out, если вы не указали явно другое имя.

При этом, как правило, объектные файлы уничтожаются. Чтобы сохранить их, можно подавить автоматический вызов линкера ключом -c (только компиляция) в команде вызова компилятора.

Пример:

$ fc -c test.f check prove.f $ ld /lib/frt0.o *.o -lF77 $ ls a.out check.f check.o prove.f prove.o test.f test.o $

Здесь добавлены файл /lib/frt0.o стартового модуля для программы на ФОРТРАНе (для C /lib/crt0.o) и библиотека - lF77 подпрограмм для ФОРТРАНа (для C - lc); могут быть добавлены и другие библиотеки. Обозначение -lx является сокращением для /lib/libx.a для любого x. Следует заметить, что библиотеки указываются последними (не являются ключами команды ld). При автоматическом вызове линкера стартовый модуль и ряд библиотек вызываются по умолчанию. Чтобы их увидеть, следует применить ключ -v в командах вызова компилятора.



Содержание раздела