LINUX.ORG.RU

[C] Неупакованные структуры в ELF

 


0

0

Смотрю в elf.h - уйма структур, описывающих заголовок и секции. Ни одна из них не упакована, поэтому теоретически там могут быть дыры, но тогда бинарники получались бы у каждого свои, ни с чем не совместимые.
Так что дыр наверняка нет. Чем это гарантируется? Почему не указали явно упаковку?

★★★★

Если под дырами понимается выравнивание, то оно описано в стандарте языка C, поэтому несовместимостей тут быть не может. Насчет почему не стали делать упаковку точно не знаю. А зачем ее делать, если размер хедера мал по сравнению с другими секциями?

Zhenyok
()
Ответ на: комментарий от Zhenyok

Выравнивание зависит от компилятора.
Плохо вот что: если мой компилятор решит, что в заголовке ELF где-то есть дырка (а это не противоречит стандарту), то при считывании структуры я получу мусор. Еще хуже, если я программно сформирую бинарник: он вообще не будет нигде работать. И это при том, что elf.h использован корректно.

unsigned ★★★★
() автор топика
Ответ на: комментарий от nanoo_linux

Это про 32-битность? В общем-то этого недостаточно. Может, у меня такая 32-битная архитектура, на которой эффективно размещение с выравниванием на 128 бит, и компилятор это учтет.
Хотя, может я придираюсь.

unsigned ★★★★
() автор топика
Ответ на: комментарий от unsigned

с выравниванием на 128 бит

  • приверы в студию. не думаю, что у производителей железа хватит ума выпустить такое поделие, разве что для специфических задач с тиражём одна штука.
  • делать 32х битный процессор с 128-битным выравниванием не логично. «32х битный процессор» - означает, что либо шина 32 бита, либо размер регистров 32 бита. зачем делать 128 битное выравнивание не понятно.
  • емнип, в elf архитектура записана. это значит, что і386 elf не пойдёл на гипотетическом «i128».
nanoo_linux
()
Ответ на: комментарий от unsigned

Не встречал такие компиляторы, которые бы для разных архитектур по-разному выравнивали данные (хотя не исключено, что они есть). А чем этот мусор тебе мешает, если elf-reader его просто не использует?

Zhenyok
()

что значит не упакована? и какие дыры там могут быть?

xterro ★★★★★
()

Что-то я никак не могу донести свою мысль.
Дыры - это байты выравнивания, которые компилятор может добавить между полями структуры. Это сломает ABI: ELF был сформирован без таких байтов, а мой компилятор решил, что они там должны быть. Смещения изменятся, и мой парсер прочитает мусор.
В общем случае - если структура сериализуется, то она должна быть упакована, потому что это единственный способ гарантировать бинарное представление. А стандарт C никакой упаковки не обещает.

unsigned ★★★★
() автор топика
Ответ на: комментарий от unsigned

видимо поэтому ABI: ELF и ABI: linux страдают gcc --version зависимостью именно поэтому наверно правильное название платформы GNU_GCC_ver/Linux например GNU_GCC_3/Linux и GNU_GCC_4/Linux это две разные несовместимые платформы

anonymous
()

> Чем это гарантируется?

Гарантируется естественным выравниваем полей. Естественное выравнивание типов - это выравнивание по границе, равной размеру типа. Т.е. для char -> 1, int16_t -> 2, int32_t -> 4, int64_t -> 8.

Почему не указали явно упаковку?

Не знаю. Может быть, потому что незачем?

anonymous
()
Ответ на: комментарий от anonymous

Гарантируется естественным выравниваем полей

Смущает это «естественным». Оно, так понимаю, гарантируется только т. н. Common Sense ) Это и так ясно, просто хотелось строчку в стандарте.
Ну да ладно, пусть этого достаточно.

unsigned ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.