Cc: Entering Preprocessor

/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 Включить оптимизацию обьектного кода

 

 

           


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: