Как указать базовые адреса для разделов при связывании или как перебазировать раздел после связывания? - PullRequest
4 голосов
/ 01 марта 2012

Символы могут быть связаны по определенным адресам с defsym, как показано здесь .У меня вопрос, можно ли сделать то же самое с разделами?То есть, учитывая некоторый объектный файл .o, можно ли указать базовый адрес, на который будут перемещены разделы?

В качестве альтернативы, можно ли перебазировать раздел после последней ссылки?То есть, чтобы изменить адрес раздела в двоичном файле и правильно переместить всю информацию, затронутую перемещением (например, относительные ветви вне раздела и т. Д.).

Если мой вопрос неясенЯ могу отредактировать его и добавить изображение, чтобы объяснить лучше.

1 Ответ

4 голосов
/ 04 марта 2012

Судя по вопросу, на который вы ссылаетесь, и тегу Linux, я предполагаю, что вы используете GNU ld.

Краткий ответ для GNU ld: да, разделы можно размещать по определенным адресам.

Более длинный ответ заключается в том, что для этого вам потребуется создать собственный скрипт компоновщика, для которого можно указать -T для ld. Если вы используете gcc в качестве оболочки около ld, вам нужно будет передать его компоновщику через опцию gcc -Wl,.

Скрипт компоновщика должен включать что-то вроде следующего:

SECTIONS {
   .text 0x08049000 :
       {
       foo.o (.text)
       bar.o (.text)
       }
}

Однако следует обратить внимание на то, что опция -T заменяет скрипт компоновщика по умолчанию, который использует ld. Вы можете изменить скрипт компоновщика по умолчанию, чтобы сделать то, что вы хотите. Сценарий компоновщика по умолчанию можно сбросить, передав параметр --verbose в ld без каких-либо других параметров.

Дополнительная информация о скриптах компоновщика доступна в Руководстве по LD .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...