[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Перемещение

Перемещение - это процесс установки соответствия между определениями имен и ссылками на них. Например, когда программа вызывает некоторую функцию, соответствующая инструкция должна передать управление по правильному целевому адресу. Для перемещаемых файлов необходимы записи перемещения, так как эти записи содержат информацию, описывающую, как следует изменить содержимое раздела, чтобы исполняемые и общие объектные файлы хранили в образе процесса правильную информацию.

Записи перемещения

typedef struct {
   Elf32_Addr   r_offset;
   Elf32_Word   r_info;
} Elf32_Rel;
typedef struct {
   Elf32_Addr   r_offset;
   Elf32_Word   r_info;
   Elf32_Sword   r_addend;
} Elf32_Rela;
typedef struct {
   Elf64_Addr   r_offset;
   Elf64_Xword   r_info;
} Elf64_Rel;
typedef struct {
   Elf64_Addr   r_offset;
   Elf64_Xword   r_info;
   Elf64_Sxword   r_addend;
} Elf64_Rela;

r_offset
В этом элементе указан адрес, по которому следует выполнить перемещение. В перемещаемых файлах это значение представляет собой смещение области памяти, в которой будет выполнено перемещение, от начала сегмента. В исполняемых и общих объектных файлах это виртуальный адрес области памяти, в которой будет выполнено перемещение.

r_info
В этом элементе указан индекс таблицы имен, по отношению к которому будет выполнено перемещение, и тип операции перемещения. Например, обработка записи, связанной с инструкцией вызова, будет содержать индекс имени вызываемой функции в таблице имен. Если индекс равен STN_UNDEF (неопределенное имя), то в качестве имени будет применяться значение 0. Типы операции перемещения зависят от процессора; их описание приведено в документации по процессору. Если показанный ниже текст относится к типу операции перемещения или индексу в таблице имен, то он описывает результат применения ELF32_R_TYPE (или ELF64_R_TYPE) или ELF32_R_SYM (или ELF64_R_SYM) к элементу r_info записи.

 

		 #define ELF32_R_SYM(i)		 ((i)>>8)
		 #define ELF32_R_TYPE(i)   ((unsigned char)(i))
		 #define ELF32_R_INFO(s,t) (((s)<<8)+(unsigned char)(t))
 
		 #define ELF64_R_SYM(i)    ((i)>>32)
		 #define ELF64_R_TYPE(i)   ((i)&0xffffffffL)
		 #define ELF64_R_INFO(s,t) (((s)<<32)+((t)&0xffffffffL))

r_addend
Этот элемент задает константу, применяемую для вычисления значения, которое должно быть сохранено в перемещаемом поле.

Как было указано ранее, явные дополнения содержатся только в записях Elf32_Rela и Elf64_Rela. Записи типа Elf32_Rel и Elf64_Rel содержат неявные дополнения к изменяемому адресу. В зависимости от архитектуры процессора, может применяться тот или иной формат. Следовательно, в конкретной реализации системы может применяться как один формат, так и несколько форматов в зависимости от контекста.

Раздел перемещений ссылается на два других раздела: таблицу имен и изменяемый раздел. Разделы связаны с помощью элементов sh_info и sh_link заголовка раздела, описанных в Разделы. В объектных файлах различных типов записи преобразования интерпретируют элемент r_offset по-разному.

Несмотря на то, что r_offset интерпретируется по-разному в объектах разных типов, интерпретация типов перемещения не изменяется.

Обычно во время перемещения ELF определяется значение указанного имени, извлекается дополнение (из перемещаемого поля или из поля дополнения в записи перемещения), к имени и дополнению применяется действие, соответствующее типу перемещения, выделяется требуемая часть результата и копируется в перемещаемое поле.

Если к одной области памяти (r_offset) применяется несколько последовательных перемещений, то они объединяются в одно, а не выполняются по очереди. Последовательными называются перемещения, расположенные одно за другим в разделе перемещений. Объединение выполняется следующим образом:

Обратите внимание, что при выполнении этих операций явно указанная область памяти используется только для первого и последнего перемещения (исходное значение и область, в которую будет помещен результат). Во всех остальных операциях данной последовательности указанная область памяти игнорируется.

В документации по ABI могут быть указаны специальные типы перемещения, которые всегда начинают или завершают последовательность перемещений.

Типы перемещения (зависит от процессора)

Примечание: В этом разделе приведена информация, зависящая от процессора. Более подробная информация приведена в документации по ABI и процессору.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]