/opt/ansic/lbin/ccom /var/tmp/ctmAAAa16327 myfunc.o -Oq00,al,ag,cn,Lm,sz,Ic,vo,lc,mf,Po,es,rs,sp,in,vc,pi,fa,pe,Rr,Fl,pv,pa,nf,cp,lx,st,ap,Pg,ug,lu,dp,fs,bp,wp! -Aa
cc: LPATH is /usr/lib/pa1.1:/usr/lib:/opt/langtools/lib:
/usr/ccs/bin/ld /opt/langtools/lib/crt0.o -u main main.o myfunc.o -lc
Cc: Entering Link editor.
Из этого примера можно посмотреть такие этапы
cpp.ansi это С препроцесор после этого запускаеться /lib/ccom – эта програма(компилятор) уже создает .о файлы. Последний этап это этап создания исполняемого кода, это Линкер, которые связывает все обьекты.
Что такое Обьектный файл?
Обьектный файл содержет машиные инструкции а данные с которых линкеровщик создает исполняемую програму. Каждий обьектный файл содержит НАЗВАНИЕ (symbol name) и ссылку на это название.
Названия делятся на 3 категории:
1) Локальные обьявления (local definition) – это коды или данные которые могут использоваться только в том обьектном файле где они обьявленые.
2) Глобальные обьявления (global definition) – это обьявления прорцедур,функций,данных котоые могут быть доступны из других обьектных файлов
3) Внешние ссылки (extern references) – это обьявления которые глобальный инаходяться в других обьектных файлах.
|
|
Для просмотра обявлений успользуеться програма nm.
Этап линкирования.
Линкирование это последний этап создания запускания файлов, он в включает в a.out файл все ссылки обьявлений и их реализации, которые встречаються в програме. Если например есть сылка а нет реализаци то линкировщик скажет что не находит внешнего обявления и выдаст следюющее:
$ cc main.c
/bin/ld: Unsatisfied symbol:
my_func (code)
Работа с библиотеками
Очень полезным средсвом для хранения сылски реализаций внешних обьявлений есть библиотеки. Стандартная библиотека libc которая содержит «основные» функции для C,Fortran
Библиотеки называються lib name. sfx
Name – название библиотеки, которая идентефецирует библиотеку
Sfx - если.а – архив,.sl – общедоступная библиотека.
Для того что б указать компилятору библиотеку то указываеться через опцию –l. Например
--lm (подключает стандартну математическую библиотеку libm.a).
По умолчанию подключаються библиотеки libcl, libisamstub, libc.
По умолчанию библиотеки ищатся по путям /lib,/usr/lib,lib/libp. Можно задать пути где искать:
1) Переменой коружения LPATH
2) Опция линкера -L
Также для каждой програмы входит обьектный файл /lib/crt0.o В этом файле содержаться таочки входа в програму,простомтр аргументов и прочее.
Можна прочитать о фунциях которые есть в стандартных библиотеках исполюзую man-page
Вызовы (функции) описываються следующим образом
Name(nL)
Name – название
N – 2-системные вызовы, 3-другие библиотеки
L – буква которая означает к которой библиотеке вызов относиться
|
|
Вот примеры:
Група | Описание |
(2) | Системные вызовы, низкоуровневый доступ до системных ресурсов. (работа с файлами,сигналы,управление процесами). Все вызовы содержаться в libc |
(3C) | Стандартные С вызовы. Находяться в libc |
(3S) | Стандартные вызова input/output (stdio(3S)) Находяться в libc |
(3M) | Математические фунции. Для подключения используеться –lm или -lM |
(3G) | Графические фунции |
(3I) | Библиотека инструментариев |
(3X) | Разные специализированые библиотеки |
Сравнительные оценки Архивных и Общедоступных библиотек | ||
Расширение | .a | .sl |
Обьектный код | Делаеться с обьектного кода | Делаеться с независимо-позиционого (PIC) обьектного кода.Делаеться компилятором с опцией +z или +Z. |
Создание | Составляеться обьектные файлы ar командой | Составляеться PIC обьекты с ld командой |
Связывание адресса вызова | Адресс определяется при линкировании програмы | Адресс определяеться при выполнении програмы |
a.out | Содержит в себе все вызовы и даные | Содержит только таблицу где где содержаться адреса иназвание библитек |
При запуске | Каждая програма содержит собственую копию библиотеки | Все програмы используют одну бублиотеку, которая в памяти присутствующая только один раз |
Опции компилятора cc
cс [option] files
· -Amode
· mode=c По умолчанию, стандартный компилятор С (по Керниган, Риттчи)
· mode=a ANSI C (ISO 9899:1990)
· mode=e Расшириное ANSI C
· -c Отменить фазу редактирования связей и создавать об'ектный файл даже в случае программы, состоящей только из одного модуля.
· -p Сгенерировать дополнительные команды для подсчета числа обращений к каждой функции. Кроме того, если имеет место фаза редактирования связей, стандартная подпрограмма инициализации заменяется на такую, которая автоматически вызывает функцию monitor(3C) и обеспечивает запись файла mount.out при нормальном завершении об'ектной программы. Профиль выполнения программы может быть затем получен при помощи команды prof(1).
· -Dname=def определяет макрос для препроцесорра (эквивалентно #define)
· -E посылает на стандартный поток вывода (по умолчанию на stderr)
· -g содержит дополнительную информацию для отладки
· -Idir Изменить алгоритм поиска включаемых (посредством директивы #include) файлов, имена которых не начинаются с символа /, а именно: сначала искать в указанном каталоге, а затем уже в каталогах стандартного списка. Так, включаемые файлы, чьи имена заданы в двойных кавычках, сначала ищутся в каталоге, содержащем файл, затем в каталогах, указанных с помощью опции -I, а затем уже в каталогах стандартного списка. Включаемые файлы, чьи имена заданы в угловых скобках, не ищутся в каталоге, содержащем файл.
· -lname включает библиотеку
· -L dir dir= Дополнить каталогом список каталогов, которые содержат об ектные библиотечные модули [для редактирования связей посредством ld
· -v расширынай информация о процессе компиляции
· -w не показывает предупреждений
· -Wx,arglist передает аргументы (опции) arglist для процеса. x
может принимать значения:
· d Driver
· p Preprocessor
· c Compiler
· a Assembler
· l Linker
· +z,+Z Опция создает PIC код
· -O Включить оптимизацию обьектного кода