Укажите минимальный начальный адрес для текстового сегмента

Как я могу сказать 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.

Другие вопросы по тегам