НАЗВАНИЕ
syms - формат таблицы имен в обычном об ектном файле
СИНТАКСИС
#include <syms.h>
ОПИСАНИЕ
Объектные файлы обычного формата содержат информацию
для поддержки, отладки в терминах исходного языка [см.
sdb(1)]. Информация о номерах строк [см. linenum(4)] и
об именах, встречающихся в программе, позволяет отлаживать программу на уровне исходного C-текста. Каждая
таблица имен в объектном файле устроена следующим образом:
Таблица имен состоит из элементов фиксированной длины (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]
Смысл значений имен пояснен во включаемом файле <syms.h>. Для описания некоторых имен требуется больше информации, чем содержится в одном элементе; в таком случае за первым элементом, описывающим имя, следуют вспомогательные элементы. Вспомогательные элементы имеют тот же размер, что и основные; их формат приведен ниже:
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.