Операционная система UNIX. Руководство программиста

Работа с архивами


Чаще всего архивные файлы используются для хранения объектных файлов, составляющих библиотеку. Имя библиотеки может указываться в командной строке при вызове редактора связей (или в опции редактора связей команды cc). В результате при разрешении ссылок редактор связей просматривает таблицу имен архивного файла.

Команда ar(1) служит для создания архивных файлов, различных действий над их содержимым, а также для операций над их таблицами имен. Синтаксис команды ar несколько отличается от принятого в ОС UNIX. В командной строке необходимо задать ключ - один из символов из набора drqtpmx. Значение ключа определяет действия команды ar. Для изменения способа выполнения требуемой операции ключ может быть скомбинирован с одним или несколькими символами из набора vuaibcls. Общий вид команды ar:

ar -ключ [позиционирующее_имя] а_файл [имя]...

где позиционирующее_имя - это имя элемента архива, которое используется с некоторыми ключевыми символами для управления размещением файлов в архиве; а_файл - это имя архивного файла. По соглашению, имена архивных файлов имеют расширение .a (например, libc.a - архивный файл, содержащий объектные файлы стандартных функций языка C). Наконец, может быть указано одно или несколько имен, задающих файлы, над которыми будет выполнена операция, определенная значением ключа.

С помощью следующей команды можно создать архивный файл, содержащий объектные модули, используемые в программе restate:

ar -rv rste.a restate.o oppty.o pft.o rfe.o

Если в текущем каталоге нет других объектных файлов, то же можно проделать с помощью команды

ar -rv rste.a *.o

В результате выполнения последней команды на экран будет выведено следующее:

ar: creating rste.a a - oppty.o a - pft.o a - restate.o a - rfe.o

Команда nm(1) используется для получения различной информации из таблицы имен объектных файлов обычного формата. Объектные файлы могут, но не обязаны, храниться в архиве. Ниже приводится результат выполнения команды

nm -f rste.a

Опция -f предписывает выдачу полной информации. Предполагается, что при компиляции использовалась опция -g.




Symbols from rste.a[oppty.o]:

Name Value Class Type Size Line Section

oppty.c | | file | | | | rec | |strtag| struct| 50| | pname | 0|strmem| char[25]| 25| |(ABS) ppx | 26|strmem| float| | |(ABS) dp | 30|strmem| float| | |(ABS) i | 34|strmem| float| | |(ABS) c | 38|strmem| float| | |(ABS) t | 42|strmem| float| | |(ABS) spx | 46|strmem| float| | |(ABS) .eos | |endstr| | 50| |(ABS) oppty | 0|extern| float( )| 100| |.text .bf | 0|fcn | | | 7|.text ps | 8|argm't| *struct-rec| 50| |(ABS) .ef | 80|fcn | | | 3|.text .text | 0|static| | 4| |.text .data | 100|static| | | |.data .bss | 100|static| | | |.bss

Symbols from rste.a[pft.o]:

Name Value Class Type Size Line Section

pft.c | | file | | | | rec | |strtag| struct| 50| | pname | 0|strmem| char[25]| 25| |(ABS) ppx | 26|strmem| float| | |(ABS) dp | 30|strmem| float| | |(ABS) i | 34|strmem| float| | |(ABS) c | 38|strmem| float| | |(ABS) t | 42|strmem| float| | |(ABS) spx | 46|strmem| float| | |(ABS) .eos | |endstr| | 50| |(ABS) pft | 0|extern| float( )| 88| |.text .bf | 0|fcn | | | 7|.text ps | 8|argm't| *struct-rec| 50| |(ABS) .ef | 68|fcn | | | 3|.text .text | 0|static| | 4| |.text .data | 88|static| | | |.data .bss | 88|static| | | |.bss

Symbols from rste.a[restate.o]:

Name Value Class Type Size Line Section

restate.c | | file | | | | .0fake | |strtag| struct| 14| | _cnt | 0|strmem| int| | |(ABS) _ptr | 4|strmem| *Uchar| | |(ABS) _base | 8|strmem| *Uchar| | |(ABS) _flag | 12|strmem| char| | |(ABS) _file | 13|strmem| char| | |(ABS) .eos | |endstr| | 14| |(ABS) rec | |strtag| struct| 50| | pname | 0|strmem| char[25]| 25| |(ABS) ppx | 26|strmem| float| | |(ABS) dp | 30|strmem| float| | |(ABS) i | 34|strmem| float| | |(ABS) c | 38|strmem| float| | |(ABS) t | 42|strmem| float| | |(ABS) spx | 46|strmem| float| | |(ABS) .eos | |endstr| | 50| |(ABS) main | 0|extern| int( )| 600| |.text .bf | 0|fcn | | | 12|.text argc | 8|argm't| int| | |(ABS) argv | 12|argm't| **char| | |(ABS) fin | -4|auto | *struct-.0fake| 14| |(ABS) oflag | -8|auto | int| | |(ABS) pflag | -12|auto | int| | |(ABS) rflag | -16|auto | int| | |(ABS) ch | -20|auto | int| | |(ABS) first | -70|auto | struct-rec| 50| |(ABS) .ef | 580|fcn | | | 68|.text FILE | |typdef| struct-.0fake| 14| | .text | 0|static| | 31| 40|.text .data | 600|static| | | |.data .bss | 892|static| | | |.bss _iob | 0|extern| | | | fprintf | 0|extern| | | | exit | 0|extern| | | | opterr | 0|extern| | | | getopt | 0|extern| | | | fopen | 0|extern| | | | fscanf | 0|extern| | | | printf | 0|extern| | | | oppty | 0|extern| | | | pft | 0|extern| | | | rfe | 0|extern| | | |



Symbols from rste.a[rfe.o]:

Name Value Class Type Size Line Section

rfe.c | | file | | | | rec | |strtag| struct| 50| | pname | 0|strmem| char[25]| 25| |(ABS) ppx | 26|strmem| float| | |(ABS) dp | 30|strmem| float| | |(ABS) i | 34|strmem| float| | |(ABS) c | 38|strmem| float| | |(ABS) t | 42|strmem| float| | |(ABS) spx | 46|strmem| float| | |(ABS) .eos | |endstr| | 50| |(ABS) rfe | 0|extern| float( )| 104| |.text .bf | 0|fcn | | | 7|.text ps | 8|argm't| *struct-rec| 50| |(ABS) .ef | 84|fcn | | | 3|.text .text | 0|static| | 4| |.text .data | 104|static| | | |.data .bss | 104|static| | | |.bss

Для работы команды nm требуется, чтобы все содержимое архива было составлено из объектных модулей. Если поместить в архив что-либо другое, то при выполнении команды nm будет выдано сообщение:

nm: rste.a: bad magic




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