Я хочу указать выравнивание для некоторых разделов. За 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
не имеет возможности показать свой скрипт компоновщика по умолчанию (он не использует его).Любая помощь будет принята с благодарностью!
Я нашел решение, которое решает мою проблему.
Выравнивание разделов данных и текста может быть достигнуто путем включения файла ассемблера с фиктивными выравниваниями. Выравнивание раздела будет максимальным выравниванием, разделенным где угодно, поэтому как минимум оно будет иметь это выравнивание.
Пример файла align.s (скомпилируйте с вашим ассемблером и включите объектный файл в вашу ссылку):
.раздел. текст .balign 0x40 .section .data .balign 0x40 .конец
Других решений пока нет …