2014-10-25 3 views
0

Мои извинения за мой плохой английский, действительно с трудом понимая, что это sh_info поле содержит для перемещения секции, следующее, что я получаю от ELF документа:перемещение информации заголовка раздела в .elf файл

enter image description here

Это говорит

sh_info: содержит индекс заголовка раздела секции , к которому относится перемещение

sh_link: содержит индекс заголовка раздела соответствующей таблицы символов.

Очевидно, что sh_info не относится к разделу таблицы символов, к которому относится раздел перемещения, информация которого хранится в sh_link.

Основываясь на моем понимании: при перемещении символа связаны три раздела: раздел перемещения, секция таблицы символов и раздел, содержащий определение символов для символов в таблице символов.

Предположение 1: Так я полагаю sh_info о третьей части упомянутого впереди

----- Однако, когда я иду через образец кода для перемещения, мое предположение, похоже, не соответствует

static int elf_do_reloc(Elf32_Ehdr *hdr, Elf32_Rel *rel, Elf32_Shdr *reltab) { 
Elf32_Shdr *target = elf_section(hdr, reltab->sh_info); 
int addr = (int)hdr + target->sh_offset; 
int *ref = (int *)(addr + rel->r_offset); 

// Symbol value 
int symval = 0; 
if(ELF32_R_SYM(rel->r_info) != SHN_UNDEF) { 
    symval = elf_get_symval(hdr, reltab->sh_link, ELF32_R_SYM(rel->r_info)); 
    if(symval == ELF_RELOC_ERR) return ELF_RELOC_ERR; 
} 

----- Sicce r_info является полем только запись в секции перемещения содержит

, что означает, что sh_info - это индекс самой секции перемещения. < Допущение 2

Что меня смущает больше, является примером кто-то другой должности, reading elf file example

, кажется, поле sh_info информация не ничего, связанных с моим предыдущим 2 допущениях

Может кто-нибудь, пожалуйста, помогите объяснить что действительно содержит sh_info?

ответ

1

О "confusing example", возможно перемещение части были удалены, но только упоминание о sh_info связано с разбором имени (динамические) символы и (как показано на изображении в вашем вопросе), что поле имеет различное значение для SHT_SYMTAB и SHT_DYNSYM (количество элементов в разделе + 1).

Section #0A  OFF: 0x000015F8 
    Name:  .rela.plt (0x00000084) 
    Type:  SHT_RELA (0x00000004) 
    Flags:  -a- 
    Addr:  0x004003E8 
    Offset: 0x000003E8 
    Size:  0x00000090 
    Link:  0x00000005 
    Info  0x0000000C 

Section #05  OFF: 0x000014B8 
    Name:  .dynsym (0x0000004E) 
    Type:  SHT_DYNSYM (0x0000000B) 
    Flags:  -a- 
    Addr:  0x00400280 
    Offset: 0x00000280 
    Size:  0x000000A8 
    Link:  0x00000006 
    Info  0x00000001 

Section #0C  OFF: 0x00001678 
    Name:  .plt (0x00000089) 
    Type:  SHT_PROGBITS (0x00000001) 
    Flags:  -ax 
    Addr:  0x004004A0 
    Offset: 0x000004A0 
    Size:  0x00000070 
    Link:  0x00000000 
    Info  0x00000000 

Вы можете видеть, что sh_link указывает на .dynsym секции и sh_info указывает на .plt раздел (который содержит исполняемый память).

Так sh_linkстоловое символа и sh_infoявляется исполняемым разделом, который модифицируется.

В основном ваш документ уже говорит об этом, но вот еще несколько ссылок.

Chapter on Sections[Рисунок 4-12: sh_link и sh_info Интерпретация]:

sh_link - Индекс заголовка секции соответствующего символа таблицы.

sh_info - Индекс заголовка раздела раздела, к которому относится перемещение.

Также есть глава о relocation:

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

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

И просто для удовольствия ... Here are (search page) Типы переезда для x86 на Linux:

#define R_X86_64_NONE   0  /* No reloc */ 
#define R_X86_64_64    1  /* Direct 64 bit */ 
#define R_X86_64_PC32   2  /* PC relative 32 bit signed */ 
#define R_X86_64_GOT32   3  /* 32 bit GOT entry */ 
#define R_X86_64_PLT32   4  /* 32 bit PLT address */ 
#define R_X86_64_COPY   5  /* Copy symbol at runtime */ 
#define R_X86_64_GLOB_DAT  6  /* Create GOT entry */ 
#define R_X86_64_JUMP_SLOT  7  /* Create PLT entry */ 
#define R_X86_64_RELATIVE  8  /* Adjust by program base */ 
#define R_X86_64_GOTPCREL  9  /* 32 bit signed pc relative 
              offset to GOT */ 
#define R_X86_64_32    10  /* Direct 32 bit zero extended */ 
#define R_X86_64_32S   11  /* Direct 32 bit sign extended */ 
#define R_X86_64_16    12  /* Direct 16 bit zero extended */ 
#define R_X86_64_PC16   13  /* 16 bit sign extended pc relative */ 
#define R_X86_64_8    14  /* Direct 8 bit sign extended */ 
#define R_X86_64_PC8   15  /* 8 bit sign extended pc relative */ 
Смежные вопросы