В чем разница между разделами data и data1 и разницей между разделами rodata и rodata1 в файле ELF?

#linker #elf

#компоновщик #elf

Вопрос:

Я проверил спецификацию ELF здесь http://www.cs.cmu.edu/afs/cs/academic/class/15213-f00/docs/elf.pdf Но никакой разницы не упоминается.

Ответ №1:

Я не нахожу ни одного документа, предписывающего это, но .rodata1 обычно появляется после всего, что начинается с .rodata . Вы можете посмотреть на скрипты компоновщика в вашей системе, чтобы убедиться в этом (обычно /usr/lib/ldscripts/).

Это делает возможными некоторые приятные вещи, например, размещение переменной для контрольной суммы в этом разделе. Это гарантирует, что он не будет доступен только для чтения, затем инструмент может вычислить контрольную сумму и внести исправления в двоичный файл.

Во время выполнения вы можете сверить свой код с контрольной суммой. Это звучит глупо для ПК, но это распространено во встроенных прошивках. Я предполагаю, что раздел был мотивирован наличием раздела «вне» кода, созданного компилятором по разным причинам, но никогда не был полностью документирован.

Ответ №2:

Насколько я знаю, они одинаковы.

Это также зависит от компилятора. Некоторые компиляторы объединяют эти 2 раздела (и, возможно, больше разделов) в «.data».

Ответ №3:

Из некоторой археологии git в источниках binutils-gdb это выглядит так:

Фиксация 252b5132c753 («Импорт исходного программного обеспечения 19990502») имеет различие, в котором упоминается:

  Fri Jul 23 13:51:09 1993  Ken Raeburn  (raeburn@cambridge.cygnus.com)
 
        * scripttempl/elf.sc: Add support for .init, .fini, .ctors,
        .dtors, .data1, .rodata1 sections, instead of combining them into
        other sections.  For `-r', set all section start addresses to
        zero.
  

Это самая ранняя ссылка, которую я могу найти. Я подозреваю, что в этот момент binutils был перенесен в исходные файлы gdb. Кажется, я не могу найти предварительно импортированные источники, которые существовали 26 лет назад. Кажется, их почтовые архивы начинаются с 1999 года. В их багтрекере нет ошибок для rodata1 .