2015-12-10 5 views
1

Я сомневаюсь в повторении некоторых эльфов. У меня есть X86_64 ABI и elf64 спецификация.Elf header - Повторение сегментов

Во-первых, все протестированные программы, находящиеся в/USR/бен и протестированы с readelf и objdump, кажется, дают практический ответ, но все же:

  • является возможным для заголовка программы, чтобы иметь больше чем 1 PT_DYNAMIC сегмент? (Мой ответ: я не вижу причин для этого, но я могу что-то пропустить.)
  • в разделе PT_DYNAMIC, возможно ли иметь два массива DT_RELA? (Мой ответ: нет, потому что в противном случае мы не знали бы наверняка, какой массив DT_RELASZ определяет. Но в то же время некоторые источники говорят о «таблице перемещения», а не «о», поэтому ... это подразумевает либо множественное PT_DYNAMIC или несколько DT_RELA .. гм-гм)

Так, мальчики :), могли бы вы подтвердить/противоречие?

ответ

1

Возможно ли, чтобы заголовок программы имел более 1 PT_DYNAMIC сегмент?

Я не верю, что что-то в формате ELF спецификации запрещает это, но если вы создаете файл с двумя PT_DYNAMIC с, вполне вероятно, что динамический загрузчик получит несчастными.

Обычный способ писать код в динамическом загрузчике:

// ehdr points to Elf64_Ehdr in memory. 
Elf64_Phdr *phdr = (Elf64_Phdr*)(ehdr + ehdr->e_phoff); 
Elf64_Phdr *dyn = NULL;  
for (j = 0; j < ehdr->e_phnum; ++j) { 
    if (phdr[j].p_type == PT_DYNAMIC) { 
    dyn = phdr + j; 
    // break; 
    } 
    // some other code 
} 

После завершения цикла выше, dyn будет указывать на экземпляр PT_DYNAMICпоследней. Но если «какой-то другой код» нет, а «разрыв» комментируется в (т.е. мы ищем только для PT_DYNAMIC), то dyn будет указывать на экземпляр PT_DYNAMICпервого.

И если в загрузчике имеется смесь обоих стилей циклов (что, вероятно, будет иметь место), тогда загрузчик, вероятно, запутается и ударит с ошибкой утверждения.

Возможно ли иметь два массива DT_RELA?

Здесь также применяются те же самые два типа циклов.

+0

Да, ничего не действует, но практика определяет правило, не так ли? –

Смежные вопросы