eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 августа!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: (+1 невидимый пользователь)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Вопросы новичков —› Выравнивание секций в ELF файлах
Посл.ответ Сообщение

Ранг: 0.4 (гость)
Статус: Участник

Создано: 15 июля 2013 11:29 New!
Цитата · Личное сообщение · #1

Доброго времени суток. Разбираю формат ELF. Первый раз для себя спустился в такой низкой уровень абстракции. В спецификации вроде бы всё хорошо описано. Появился один вопрос, который муляет меня еще с начала изучение формата. Выравнивание секций, addralign. Исследуя тестовый файл, что при значении 4, следующая секция начинается сразу же после предыдущей. Если какое-то другое значение например 2, тогда между секциями появляется как бы зазор в 2 байта. Был бы рад, если кто-то смог бы объяснить для полного понимания, как оно вычисляется при построении образа файла. Или, например, как вычислить это значение для новой секции, которая добавляется в конец.


Ранг: 1011.0 (!!!!)
Статус: Участник

Создано: 15 июля 2013 11:53 New!
Цитата · Личное сообщение · #2

что не понятно в термине "выравнивание на границу в 4 байта" ?


Ранг: 296.9 (наставник)
Статус: Участник

Создано: 15 июля 2013 12:11 New!
Цитата · Личное сообщение · #3

Выравнивание идёт по формуле(синтаксис си):
до нижней границы
aligned_addr_lower = addr & ((DWORD)(-1) ^ ((1 << n) - 1)), где n - степень двойки, addralign = 2 ^ n (2 в степени n)
до верхней границы
aligned_addr_upper = aligned_addr_lower + (1 << n)

| Сообщение посчитали полезным: VictorAky


Ранг: 0.4 (гость)
Статус: Участник

Создано: 15 июля 2013 12:14 New!
Цитата · Личное сообщение · #4

reversecode, Например, смещение секции 0х284, размер ее 0х10, выравнивание 0х4, следующая секция начинается по адресу 0х284+0х10 = 0х294. Потом, секция смещение 0х294, размер 0х2е, выравнивание 0х4, после чего следует секция смещение 0х2d0, размер 0х30, выравнивание 0х10. Тоесть начало секции находится не по адресу 0х294+0х2е = 0х2с2, а по 0х2d0. Почему так?


Ранг: 296.9 (наставник)
Статус: Участник

Создано: 15 июля 2013 12:24 · Поправил: DenCoder New!
Цитата · Личное сообщение · #5

VictorAky пишет:
Тоесть начало секции находится не по адресу 0х294+0х2е = 0х2с2, а по 0х2d0. Почему так?

Потому что выравнивается начало секции

(addr + ((1 << n) - 1)) & ((DWORD)(-1) ^ ((1 << n) - 1))

n = 4
2 ^ 4 = 0x10
(0x2c2 + (0x10 - 1)) & (0xFFFFFFFF ^ (0x10 - 1)) = (0x2c2 + 0xF) & (0xFFFFFFFF ^ 0xF) = 0x2d1 & 0xFFFFFFF0 = 0x2d0

Ранг: 0.4 (гость)
Статус: Участник

Создано: 15 июля 2013 12:34 · Поправил: VictorAky New!
Цитата · Личное сообщение · #6

DenCoder, addr в этом случае будет 2с2? Как вычислить n для новой секции?) Много вопросов, но я признателен за каждый ответ) Почему n = 4? Спасибо, тема закрыта.


Ранг: 296.9 (наставник)
Статус: Участник

Создано: 15 июля 2013 12:39 · Поправил: DenCoder New!
Цитата · Личное сообщение · #7

VictorAky пишет:
DenCoder, addr в этом случае будет 2с2?

да

VictorAky пишет:
Как вычислить n для новой секции?)

addralign у вас в последней секции 0x10, для простоты n можно и не вычислять(лишнего дал), можно так
aligned_addr = (addr + (addralign - 1)) & ((DWORD)(-1) ^ (addralign - 1))
То есть начало секции будет по этому адресу

Аналогичная формула
addr_align = (addr + addralign - 1) & ~(addralign - 1)
На паскале
addr_align := (addr + addralign - 1) AND NOT(addralign - 1)

Или
next_section_start = (cur_section_start + cur_section_size + next_addralign - 1) & ~(addralign - 1)
На паскале
next_section_start := (cur_section_start + cur_section_size + next_addralign - 1) AND NOT(addralign - 1)


Ранг: 72.3 (постоянный)
Статус: Участник

Создано: 15 июля 2013 18:42 New!
Цитата · Личное сообщение · #8

Ущербный формат. Как может быть выравниванье(и соответственно атрибуты) на 4, ежели размер минимальный - физическая страница(0x1000)..


Ранг: 1986.5 (!!!!)
Статус: Модератор
retired

Создано: 15 июля 2013 22:02 New!
Цитата · Личное сообщение · #9

Раз тема закрыта, то закрою.
 eXeL@B —› Вопросы новичков —› Выравнивание секций в ELF файлах
Эта тема закрыта. Ответы больше не принимаются.

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS