Золотой компоновщик: указать выравнивание разделов

Я хочу указать выравнивание для некоторых разделов. За ld 2.20.0 работает следующий подход:

  • создайте скрипт компоновщика, содержащий только те разделы, которые должны быть выровнены, например:

    SECTIONS
    {
    .data ALIGN(0x40): { *(.data) }
    
    .text ALIGN(0x40): { *(.text) }
    
    .plt ALIGN(0x10): { *(.plt) }
    }
    
  • затем связать с:

    -rpath-link=/path/to/LinkerScript.ld /path/to/LinkerScript.ld
    

    например включите скрипт в rpath-link и передайте его как один из объектных файлов.

Теперь при связывании таким же образом, используя gold 2.23.1, скрипт отклонен с этой ошибкой:

LinkerScript.ld: SECTIONS seen after other input files; try -T/--script

Так что gold хочет, чтобы я указал полный скрипт компоновщика, однако я хочу изменить только пару атрибутов. Это возможно?

Я уже попробовал:

  • Передача сценария с -T вариант. Это создает испорченный исполняемый файл, который не запускается. Как я понимаю это потому что -T принимает только полные сценарии компоновщика, в то время как приведенное выше является просто «аннотацией» к существующему сценарию.
  • В том же духе, при прохождении сценария с -T возможность ld 2.20.0 он не может связать, так как некоторые разделы не определены. Это не «полный» скрипт компоновщика для моего варианта использования.
  • Поэтому я попытался получить полный скрипт компоновщика. ld --verbose распечатает скрипт компоновщика по умолчанию. Мне пришлось удалить пару символов, которые не были поняты goldвпоследствии исполняемый файл, созданный с -T/path/to/LinkerScript.ld опция больше не работает
  • к несчастью gold не имеет возможности показать свой скрипт компоновщика по умолчанию (он не использует его).
  • Страницы руководства не указывают, как изменить выравнивание для вышеприведенного случая с параметром.

Любая помощь будет принята с благодарностью!

1

Решение

Я нашел решение, которое решает мою проблему.

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

    Пример файла align.s (скомпилируйте с вашим ассемблером и включите объектный файл в вашу ссылку):

.раздел. текст
.balign 0x40

.section .data
.balign 0x40

.конец
  • Золотой компоновщик выравнивает записи PLT и GOT по их размеру (16 и 8 байтов соответственно). Этого достаточно для моего варианта использования.
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]