Сборка программ
#define STB_LOCAL О ttdefine STB_GLOBAL 1 tdefine
STB_WEAK 2 ttdefine STB_NUM 3 #define STB_LOOS 10 #define STB HIOS 12
/* Локальный символ */
/* Глобальный символ */
/* Слабый символ */
/* Кол-во определенных типов. */
/* Начало ОС-зависимых значений */ _
/* Конец ОС-зависимых значений */
#define STB_LOPROC 13 /* Начало процессорно-зависимых значений
*/ tdefine STB_HIPROC 15 /* Конец процессорно-зависимых значений */
/* Допустимые значения для подполя ST TYPE поля st info (тип символа). */
#define STT_NOTYPE 0 #define STT_OBJECT 1 #define STT FUNC 2
He указан */
Символ – объект данных */
Символ – объект кода */
STT_SECTION 3 /* Символ связан с секцией */
4define STT_FILS 4 /* Имя символа – имя файла */
*define ^тт NUM ^ /* Кол-во определенных типов */
"define STT LOOS 1^ /* Начало ОС-зависимых значений */
"define STT_HIOS 12 /* Конец ОС-зависимых значений */
*define STT_LOPROC 13 /* Начало процессорно-зависимых значений */
"define STT_HIPROC 15 /* Конец процессорно-зависимых значений */
/* Индексы таблицы символов размещены в группах и цепочках хэша
в секции кэш-таблицы символов. Это специальное значение индекса
указывает на конец цепочки, и означает, что в этой группе более нет символов. */
((define STNJJNDEF 0 /* Конец таблицы. */
/* Элемент таблицы перемещений без добавочного значения (в секциях типа SHT_REL). */
typedef struct (
Elf32_Addr r_offset; /* Адрес */
Elf32_Word r_info; /* Тип перемещения и индекс символа */ } Elf32_Rel;
/* Элемент таблицы перемещений с добавочным значением (в секциях типа SHT_RELA). */
typedef struct (
Elf32_Addr r_offset; /* Адрес */
Elf32_Word r_info; /* Тип перемещения и индекс символа */
Elf32_Sword r_addend; /* Добавочное значение */) Elf32_Rela;
/* Как извлекать информацию из и включать ее в поле r_info. */
#define ELF32_R_SYM(val) ((val) " 8)
Define ELF32_R_TYPE(val) ((val) & Oxff)
#define ELF32_R_INFO(sym, type) (((sym) " 8) + ((type) & Oxff))
/* Типы перемещений для 1386 (формулы взяты из
[docs.sun.com 816-0559-10] – авт.)
А – добавочное значение, используемое при вычислении значения перемещаемого поля.
В – базовый адрес, начиная с которого разделяемый объект загружается в память
при исполнении [программы].
Обычно разделяемый объект строится с базовым виртуальным адресом, равным О,
но адрес при исполнении иной.
G – смещение записи в глобальной таблице смещений,
где адрес перемещаемого символа находится во время исполнения.
GOT – адрес глобальной таблицы смещений.
L – местоположение (смещение в секции или адрес) записи символа
в процедурной таблице связывания (PLT).
PLT перенаправляет вызов функции по настоящему адресу.
Редактор связей создает начальную таблицу, а редактор связей
времени исполнения модифицирует записи во время исполнения.
Р – местоположение (смещение в секции или адрес) перемещаемого
элемента памяти (вычисляется с использованием r_offset).
S – значение символа, индекс которого находится
в элементе таблицы перемещений. */
#define R_386_NONE 0 /* Не перемещать */
ttdefine R__386_32 I /* Прямое 32-разрядное – S + А */
#define R_386_PC32 2 /* 32-разрядное относительно PC-S+A-PV
^define R_386_GOT32 3 /* 32-разрядный элемент GOT – G + А */
#define R_386_PLT32 4 /* 32-разрядный адрес PLT – L + А – Р */
ttdefine R_386_COPY 5 /* Копировать символ при исполнении */
#define R_386_GLOB_DAT 6 Л Создать запись GOT – S*/
#define R_386_JMP_SLOT 7 /* Создать запись PLT – S */
tfdefine R_386_RELATIVE 8
/* Сдвинуть относительно базы программы – В + А */
tdefine R_386_GOTOFF 9 /* 32-разрядное смещение GOT – S + А – GOT
*/ ^define R_386_GOTPC 10 /*' 32-разрядное смещение GOT относительно
PC -S + А -GOT */
/* Должна быть последняя запись.
*/ #define R 386 NUM 11