Unix Man (Справочное руководство)

         

SYMS(4)


SYMS(4)

НАЗВАНИЕ


syms - формат таблицы имен в обычном об ектном файле

СИНТАКСИС

#include <syms.h>

ОПИСАНИЕ


Объектные файлы обычного формата содержат информацию для поддержки, отладки в терминах исходного языка [см. ]. Информация о номерах строк [см. ] и об именах, встречающихся в программе, позволяет отлаживать программу на уровне исходного 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]

            Смысл значений имен пояснен во включаемом файле <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), .

            в Справочнике пользователя.

            ПРЕДОСТЕРЕЖЕНИЯ



            На компьютерах, у которых тип int эквивалентен типу long, вместо long в таблице имен указывается int. Таким образом, в таблице отсутствует информация о том, как на самом деле описано имя: как int или как long.


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