2

我正在为 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;

为什么链接器从编译器中切换?我该如何防止这种情况?

4

1 回答 1

4

我根本不会Driver在您的任何 GPR 包中使用。一旦gprbuild看到for Target use "arm-eabi";它就知道要添加arm-eabi-到每个工具。

没有理由避免将编译器开关传递给默认链接器驱动程序,即gcc(在本例中arm-eabi-gcc),因为它知道将它们中的哪一个传递给链接器。

你可能会从我的cortex-gnat-rts项目中发现这些有趣的东西:runtime.xml(但请注意,细节可能与 AdaCore 的运行时不同),testbed.gpr

于 2019-03-18T08:56:18.187 回答