Добавление перемещения в файлы ELF - Elf64_Rel против Elf64_Rela? - PullRequest
1 голос
/ 29 февраля 2020

ELF-файлы содержат две структуры для обработки перемещений:

Elf64_Rel :

typedef struct {
  Elf64_Addr r_offset;
  Uint64_t
  r_info;
} Elf64_Rel;

и Elf64_Rela :

typedef struct {
  Elf64_Addr r_offset;
  uint64_t
  r_info;
  int64_t
  r_addend;
} Elf64_Rela;

Я хочу взглянуть на записи о перемещении, но я не уверен, какой из них использовать, страницы справочника довольно скучны по этому поводу. Есть ли конкретное c использование для каждого?

1 Ответ

2 голосов
/ 29 февраля 2020

Это зависит от цели. Большинство целей используют только одну из двух форм. Глава Перемещение в двоичном интерфейсе приложения System V (спецификация ELF) гласит:

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

Формат ELF самоописывает себя в том смысле, что он показывает, используются ли перемещения REL или RELA (SHT_REL или SHT_RELA для типа секции; DT_REL, DT_RELSZ, DT_RELENT или DT_RELA, DT_RELASZ, DT_RELAENT в разделе Dynami c). Но сама обработка перемещения очень специфична для цели c.

...