Секции DSECT, COPY, INFO и OVERLAY
При определении секций им может быть назначен тип. Пример:
SECTIONS { name1 0x200000 (DSECT) : { file1.o } name2 0x400000 (COPY) : { file2.o } name3 0x600000 (NOLOAD): { file3.o } name4 (INFO) : { file4.o } name5 0x900000 (NOLOAD): { file5.o } }
Применение опции DSECT приводит к созданию так называемой фиктивной секции. Свойства фиктивной секции таковы:
- Не размещается, то есть не принимается во внимание при распределении памяти для выходных секций, поэтому не занимает памяти и не фигурирует в карте распределения памяти, которую выдает ld(1).
- Может перекрываться с другими выходными секциями, включая фиктивные, и даже с неконфигурируемыми областями памяти.
- Глобальные имена, определенные в фиктивной секции, перемещаются обычным образом. В таблице имен выходного файла они имеют то же значение, которое имели бы, будь DSECT-секция действительно загружена по назначенному ей виртуальному адресу. Если в DSECT-секции найдены неопределенные внешние имена, то библиотеки объектных файлов, если указаны, просматриваются, чтобы найти элементы, где эти имена определяются. Связи найденных объектных файлов редактируются обычным образом, то есть не как фиктивные секции.
- В выходной файл не включается ни содержимое фиктивной секции, ни ассоциированная с ней информация о настройке ссылок и номерах строк, если таковая имеется.
В приведенном примере ни одна секция из файла file1.o не размещается, но в то же время выполняется настройка всех ссылок, как если бы эти секции действительно связывались с назначенными адресами. Другие секции могут ссылаться на определенные там глобальные имена, и эти ссылки разрешатся правильно.
Секция с опцией COPY подобна фиктивной секции с той лишь разницей, что данные COPY-секции и вся связанная с ней информация включаются в выходной файл.
Те же свойства, что и COPY, имеют INFO-секции, однако назначение последних - хранить информацию о самом объектном файле, в то время как секции COPY могут содержать действительные данные или команды.
Секция типа NOLOAD лишь в одном отношении отличается от обычной выходной секции: содержащиеся в ней команды и/или данные не включаются в выходной файл. Под NOLOAD-секцию, однако, отводится виртуальная память, она фигурирует в карте распределения памяти и т.п.
Секция типа OVERLAY настраивается и записывается в выходной файл. От обычной секции она отличается тем, что не размещается и может перекрываться с другими секциями и неконфигурируемыми областями памяти.