Как использовать команду INCLUDE в скрипте компоновщика ld

У меня есть два скрипта компоновщика: common.ld, который определяет некоторые символы, и app.ld, который позиционирует разделы, используя эти определения.

Если я просто свяжу два файла вместе и передам их ld (через gcc), это сработает. Если я использую команду INCLUDE:

ВКЛЮЧИТЬ common.ld

Я получаю сообщение об ошибке:

ld.exe: неверный синтаксис в флагах

collect2: ld вернул 1 статус выхода

Что я делаю неправильно? Что такое правильное утверждение для включения другого сценария загрузки?


Из http://www.scoberlin.de/content/media/http/informatik/gcc_docs/ld_3.html#IDX204 :

ВКЛЮЧИТЬ имя файла

На этом этапе укажите имя файла сценария компоновщика. Файл будет искаться в текущем каталоге и в любом каталоге, указанном с опцией -L. Вы можете вкладывать вызовы INCLUDE до 10 уровней в глубину.

Примечание. Я запускаю это на ПК с Windows 7, используя инструменты arm gcc от Code Red, полная версия:

arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 4.6.2 20121016 (release) [ARM/embedded-4_6-branch revision 192487


person parvus    schedule 08.10.2013    source источник
comment
Я только что нашел этот поиск информации о включении скрипта компоновщика. Вам все еще нужна помощь с этим? Какую командную строку вы выполняете для вызова компоновщика? Я бы подумал, что ошибка в флагах произойдет в команде, а не внутри файла.   -  person Austin Mullins    schedule 26.11.2013
comment
Привет. У меня нет имени символа или имени файла компоновщика под названием «флаги». Теперь я обошел это, используя sed в моем make-файле и самостоятельно заменив оператор include непосредственно перед компоновкой, и это работает нормально. Оба файла расположены в одном каталоге, так что компоновщик обязательно найдет файл.   -  person parvus    schedule 27.11.2013
comment
Хорошо, спасибо, что поделились этим обходным путем. Я бы подумал, что под флагами подразумеваются такие параметры, как параметры командной строки.   -  person Austin Mullins    schedule 30.11.2013


Ответы (3)


Это интересно. По-видимому, есть ошибка в лексере командного файла ld. Я использую binutils версии 2.24 и столкнулся с той же проблемой. В одном из ваших включенных файлов есть команда MEMORY, например

MEMORY
{
  rom (rx) : ORIGIN = 0x00000000, LENGTH = 64M
  ram (!rx) : ORIGIN = 0x48000000, LENGTH = 32M
}

Я думаю (но не доказал), что лексер возвращает «!rx» вместо «rx» для второго атрибута во включенном файле. Изменение команды ПАМЯТЬ на

MEMORY
{
  rom (rx) : ORIGIN = 0x00000000, LENGTH = 64M
  ram (! rx) : ORIGIN = 0x48000000, LENGTH = 32M
}

устраняет проблему. Я просмотрел ldlex.l и ldgram.y в исходниках ld, но не смог найти очевидную ошибку до того, как у меня начали болеть глаза.

Отчет об ошибке: https://sourceware.org/bugzilla/show_bug.cgi?id=17900< /а>

person Richard Pennington    schedule 09.10.2014

Синтаксис включения должен быть правильным, здесь отлично работает INCLUDE common.ld.

Может быть, в версии ld для Windows была ошибка, или, может быть, что-то не так с одним из ваших скриптов компоновщика или с окружением?

person Aleksi Torhamo    schedule 22.03.2014

Я обновляю свой тулчейн с arm_eabi-2011.03 до arm-2012.09. потом появилась проблема. Я должен скопировать файл INCLUDEd в свой скрипт ссылки, чтобы избежать проблемы с «флагом».

Интересно, как новая версия набора инструментов могла испортить функции старой версии?

person user1932637    schedule 31.10.2014
comment
Я предполагаю, что изменение правил синтаксического анализа не было достаточно тщательно протестировано. Вы пробовали принятый ответ выше (пробел после восклицательного знака? Это помогло мне. - person parvus; 01.11.2014