Сборка программ
#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