SYMS(4) SYMS(4) НАЗВАНИЕ syms - формат таблицы имен в обычном объектном файле СИНТАКСИС |#include ОПИСАНИЕ Объектные файлы обычного формата содержат информацию для поддержки, отладки в терминах исходного языка [см. sdb(1)]. Информация о номерах строк [см. linenum(4)] и об именах, встречающихся в программе, позволяет отлажи- вать программу на уровне исходного C-текста. Каждая таблица имен в объектном файле устроена следующим обра- зом: |Имя первого файла. | Имя первой функции. | Локальные имена из первой функции. | Имя второй функции. | Локальные имена из второй функции. | ... | Имена, локальные в первом файле (описанные вне | функций как static). |Имя второго файла. | Имя первой функции. | Локальные имена из первой функции. | Имя второй функции. | Локальные имена из второй функции. | ... | Имена, локальные во втором файле. | ... |Определенные глобальные имена. |Неопределенные глобальные имена. Таблица имен состоит из элементов фиксированной длины (18 байт). Элемент, описывающий имя, кроме собственно текста имени, дополненного нулями, содержит его значе- ние и другую информацию. Ниже приведена соответствующая C-структура: |#define SYMNMLEN 8 /* Максимальное количество символов | в тексте имени */ |#define FILNMLEN 14 /* Максимальное количество символов | в имени файла */ |#define DIMNUM 4 /* Размерность массива во вспомога- | тельном разделе */ |struct syment { | union { /* Все способы описать текст имени */ | char _n_name[SYMNMLEN]; /* Текст имени */ | struct { | long _n_zeroes; /* Если == 0, то в таблице цепочек */ | long _n_offset; /* Смещение в табл. цепочек */ | } _n_n; | char *_n_nptr[2]; | } _n; | long n_value; /* Значение имени */ | short n_scnum; /* Номер секции */ | unsigned short n_type; /* Тип и производный тип */ | char n_sclass; /* Класс памяти */ | char n_numaux; /* Число вспомогательных | элементов */ |}; |#define n_name _n._n_name |#define n_zeroes _n._n_n._n_zeroes |#define n_offset _n._n_n._n_offset |#define n_nptr _n._n_nptr[1] Смысл значений имен пояснен во включаемом файле . Для описания некоторых имен требуется больше информации, чем содержится в одном элементе; в таком случае за первым элементом, описывающим имя, следуют вспомогательные элементы. Вспомогательные элементы име- ют тот же размер, что и основные; их формат приведен ниже: |union auxent { | struct { | long x_tagndx; /* Индекс описателя структуры, | объединения или перечисления */ | union { | struct { | unsigned short x_lnno; /* Номер строки | определения */ | unsigned short x_size; /* Размер массива, структуры | или объединения */ | } x_lnsz; | long x_fsize; /* Размер функции */ | } x_misc; | union { | struct { | long x_lnnoptr; | long x_endndx; | } x_fcn; | struct { /* Если массив, то его размерности (до 4) */ | unsigned short x_dimen [DIMNUM]; | } x_ary; | } x_fcnary; | unsigned short x_tvndx; | } x_sym; | struct { | char x_fname [FILNMLEN]; /* Имя файла (занимает весь | элемент) */ | } x_file; | struct { | long x_scnlen; /* Длина секции */ | unsigned short x_nreloc; /* Число элем. с инф. о | настройке ссылок */ | unsigned short x_nlinno; /* Число элем. с инф. о | номерах строк */ | } x_scn; | struct { | long x_tvfill; | unsigned short x_tvlen; | unsigned short x_tvran[2]; | } x_tv; |}; Элементы таблицы имен нумеруются, начиная с 0. СМ. ТАКЖЕ a.out(4), linenum(4). sdb(1) в Справочнике пользователя. ПРЕДОСТЕРЕЖЕНИЯ На компьютерах, у которых тип int эквивалентен типу long, вместо long в таблице имен указывается int. Таким образом, в таблице отсутствует информация о том, как на самом деле описано имя: как int или как long.