![]() |
eXeL@B —› Вопросы новичков —› Выравнивание секций в ELF файлах |
Посл.ответ | Сообщение |
|
Создано: 15 июля 2013 11:29 · Личное сообщение · #1 Доброго времени суток. Разбираю формат ELF. Первый раз для себя спустился в такой низкой уровень абстракции. В спецификации вроде бы всё хорошо описано. Появился один вопрос, который муляет меня еще с начала изучение формата. Выравнивание секций, addralign. Исследуя тестовый файл, что при значении 4, следующая секция начинается сразу же после предыдущей. Если какое-то другое значение например 2, тогда между секциями появляется как бы зазор в 2 байта. Был бы рад, если кто-то смог бы объяснить для полного понимания, как оно вычисляется при построении образа файла. Или, например, как вычислить это значение для новой секции, которая добавляется в конец. ![]() |
|
Создано: 15 июля 2013 11:53 · Личное сообщение · #2 |
|
Создано: 15 июля 2013 12:11 · Личное сообщение · #3 Выравнивание идёт по формуле(синтаксис си): до нижней границы aligned_addr_lower = addr & ((DWORD)(-1) ^ ((1 << n) - 1)), где n - степень двойки, addralign = 2 ^ n (2 в степени n) до верхней границы aligned_addr_upper = aligned_addr_lower + (1 << n) ----- IZ.RU ![]() |
|
Создано: 15 июля 2013 12:14 · Личное сообщение · #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. Почему так? ![]() |
|
Создано: 15 июля 2013 12:24 · Поправил: DenCoder · Личное сообщение · #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 ----- IZ.RU ![]() |
|
Создано: 15 июля 2013 12:34 · Поправил: VictorAky · Личное сообщение · #6 |
|
Создано: 15 июля 2013 12:39 · Поправил: DenCoder · Личное сообщение · #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) ----- IZ.RU ![]() |
|
Создано: 15 июля 2013 18:42 · Личное сообщение · #8 |
|
Создано: 15 июля 2013 22:02 · Личное сообщение · #9 |
![]() |
eXeL@B —› Вопросы новичков —› Выравнивание секций в ELF файлах |
Эта тема закрыта. Ответы больше не принимаются. |