GPRbuild: переключатель компилятора передается компоновщику

#linker #arm #ada #gnat #gprbuild

#компоновщик #arm #ada #gnat #gprbuild

Вопрос:

Я создаю простую программу для ARM. GPRbuild выводит следующее:

 gprbuild -p -P avocado_test.gpr (in directory: /home/rodeo/Projects/AvocadoTest)
Bind
   [gprbind]      run_avocado_test.bexch
   [Ada]          run_avocado_test.ali
Link
   [link]         run_avocado_test.adb
/opt/GNAT/arm-elf/bin/arm-eabi-ld: unrecognised emulation mode: cpu=cortex-m3
Supported emulations: armelf
gprbuild: link of run_avocado_test.adb failed
Compilation failed.

  

Из того, что я смог найти в Интернете, ld имеет переключатель -m , который определяет режим эмуляции. Однако я не использую этот переключатель в компоновщике моего проекта. Однако я использую -mcpu=cortex-m3 переключатель в компиляторе, и похоже, что каким-то образом GPRbuild также передает этот переключатель компоновщику. Вот мой .gpr файл:

 project Avocado_Test is

   for Source_Dirs use ("source");
   for Object_Dir  use "build";
   for Main use ("source/run_avocado_test.adb");

   for Target use "arm-eabi";
   for Runtime ("Ada") use "ravenscar-sfp-sam3x8e";

   package Builder is
      for Executable_Suffix use ".elf";
      for Switches ("Ada") use ("-j0");
   end Builder;

   package Compiler is
      for Driver ("Ada") use "arm-eabi-gcc";
      for Switches ("Ada") use (
        "-mthumb",
        "-mcpu=cortex-m3",
        "-O2");
   end Compiler;

   package Binder is
      for Driver ("Ada") use "arm-eabi-gnatbind";
   end Binder;

   package Linker is
      for Driver use "arm-eabi-ld";
   end Linker;

end Avocado_Test;

  

Почему компоновщик принимает переключатель от компилятора? Как мне предотвратить это?

Комментарии:

1. Вы не показываете весь свой GPR, поэтому трудно сказать. Я взглянул на свои голые проекты. Я никогда не указываю эти параметры в проекте GPR, потому что runtime.xml файл для моей среды выполнения вставляет их в нужное место. Вы пробовали не указывать их и посмотреть, добавляет ли среда выполнения их соответствующим образом при сборке?

2. Я отредактировал, чтобы включить полный файл .gpr. Комментирование Linker'Driver атрибута приводит к некоторым различным ошибкам, которые взяты из библиотеки, которую я создал. Похоже, мне нужно взглянуть на мой runtime.xml файл и, возможно, также перестроить библиотеку, поскольку пакеты компилятора и компоновщика выглядят аналогично в этом проекте. Спасибо за идею.

3. Итак, получается, что в runtime.xml файл добавлял переключатели компилятора к Linker'Required_Switches атрибуту. Этот файл и среда выполнения генерируются из bb-runtimes Adacore. Это не имеет никакого смысла, с какой стати переключатели компилятора должны добавляться к переключателям компоновщика?

4. Я понятия не имею, что такое GPRBuild, но в общем неправильно связывать любую программу пользовательского уровня напрямую с ld — всегда следует использовать драйвер компилятора ( arm-eabi-gcc здесь) вместо этого.

5. О, я не знал, что компилятор смог выбрать правильный компоновщик таким образом.

Ответ №1:

Я бы вообще не стал использовать Driver ни в одном из ваших пакетов GPR. Как только gprbuild видит for Target use "arm-eabi"; , он знает, что нужно добавить arm-eabi- к каждому инструменту.

Нет причин избегать передачи переключателей компилятора драйверу компоновщика по умолчанию, которым является gcc (в данном случае arm-eabi-gcc ), поскольку он знает, какие из них передавать компоновщику.

Вы могли бы найти это интересным из моего проекта cortex-gnat-rts: runtime.xml (но обратите внимание, детали могут отличаться от сред выполнения AdaCore), testbed.gpr.

Комментарии:

1. Спасибо, кажется, удаление Driver из всего устранило проблему. Я должен был сделать это в отношении проекта библиотеки, который я также упомянул в другом комментарии, и «разные ошибки», которые я упомянул в этом комментарии, были вызваны тем, что я создал библиотеку как автономную, что, по-видимому, означает, что она не использует и не включает среду выполнения.