#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
.