Почему мой системный сценарий ld использует выражение типа «точка = точка»?

#linker #ld #linker-scripts

#компоновщик #ld #компоновщик-скрипты

Вопрос:

При сбросе скрипта компоновщика моей системы с ld -verbose помощью, я отмечаю, что он использует:

   .data1          : { *(.data1) }                                                                                                                                                                                   
  _edata = .; PROVIDE (edata = .);                                                                                                                                                                                  
  . = .;                                                                                                  
  __bss_start = .;                                                                                        
  .bss            :  
 

почему он присваивает текущий адрес текущему адресу?

Ответ №1:

. = .; служит барьером для размещения бесхозного раздела.

https://sourceware.org/binutils/docs/ld/Location-Counter.html говорит»… Вместо этого предполагается, что все присваивания или другие операторы принадлежат предыдущему разделу вывода, за исключением особого случая присваивания » .

После того, как компоновщик выберет наилучшее описание раздела вывода, он пропустит следующие назначения, не связанные с . символами. С помощью a . = .; компоновщик прекратит поиск и поместит потерянный раздел непосредственно над . = .; .