Укажите минимальный начальный адрес для текстового сегмента
Как я могу сказать lld разместить код в определенной позиции или выше?
У меня есть устаревший фрагмент кода, который опирается на довольно сомнительный фрагмент логики: определенная функция может получить значение, которое либо представляет индекс в массиве указателей на функции, либо фактически является указателем на функцию. Функция определяет тип значения, проверяя, меньше ли оно значения, чем 0x10000
; если это так, это индекс. Если нет, это указатель на функцию.
Как бы мне ни хотелось, я не могу изменить этот кусок кода.
К сожалению, тест даже не работает: в OSX (он не проявил себя как проблема для кого-либо еще), указатели на функции в программе могут иметь гораздо более низкие адреса, чем это пороговое значение, что означает, что рассматриваемая функция обнаруживает их как индексы, а не указатели, и все идет не так.
Есть ли инструкция, которую я могу дать компоновщику - в этом случае lld - заставить его разместить весь сгенерированный код на уровне или выше? 0x10000
так что эта проблема исчезнет, пока кто-нибудь не сможет исправить нелепый тест?
Я попробовал -sectalign
вариант, но это дает следующую ошибку:
ld: аргумент для -sectalign должен быть меньше или равен 0x8000
0x8000
не достаточно; код все еще находится в пространстве между ним и 0x10000
и логика все еще не работает.
Есть ли другой вариант, который я могу использовать, чтобы сделать это?
0 ответов
Вам нужно будет написать сценарий компоновщика. LLD поддерживает сценарии компоновщика в стиле GNU LD. Они будут выглядеть примерно так:
SECTIONS
{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}
Этот скрипт поместит раздел.text по адресу 0x8000000.