更改GNAT运行时名称

4

我正在构建自己的Ada运行时系统。

然而,只有当它被命名为“gnat”并编译为“libgnat.a”时,才能再次链接自定义运行时。如果我使用其他名称,则会出现ld错误:

/home/mark/opt/GNAT/2021/bin/../libexec/gcc/x86_64-pc-linux-gnu/10.3.1/ld: cannot find -lgnat

您有什么想法来配置它,使我可以使用不同的名称?

这是运行时的项目文件(其中大部分来自OSdev)。

project milo is
   
  for Languages use ("Ada");
  for Runtime ("Ada") use Project'Project_Dir;
  
  for Library_Auto_Init use "False";
  for Library_Name use "milo"; -- that must be "gnat"
  for Library_Kind use "static";

  for Library_Dir use "lib";
  for Object_Dir use "obj";
  for Source_Dirs use ("src/zfp", "src/milo");

   package Builder is
      for Global_Configuration_Pragmas use "milo.adc";
      for Switches ("Ada") use (
        "-nostdlib",
        "-nostdinc"
      );
   end Builder;

  package Compiler is
      for Default_Switches ("Ada") use (
        "-O2",
        "-ffunction-sections", 
        "-fdata-sections",
        "-fcallgraph-info=su,da",
        "-gnatp",
        "-gnatn2",                           
        "-gnat2012",
        "-gnatg",
        "-Wl,--gc-sections",
        "-gnatyN"
      );
   end Compiler;

end milo;

以下是我试图使用这个运行时的项目

project Helloworld is

   for Source_Dirs use ("src");
   for Object_Dir use "obj";
   for Main use ("helloworld.adb");
   for Runtime ("ada") use "/home/mark/Milo/milo/";

end Helloworld;

1
我在gpr文件中找不到连接器包,但是我希望这就是不同库名称被使用的地方。(您还可以研究一下例如AVR-Ada项目如何进行自己的RTS...或者我的旧MSP430项目https://sourceforge.net/projects/msp430ada/) - user1818839
看起来你可以在 makefile 的 RTS_LIB_LIST 设置下指定运行时库。我真的希望避免使用 makefile! - Mark
2个回答

3

请查看此处,其中有一个名为stm32f4的运行时示例,适用于STMicroelectronics的基于Cortex M4F的STM32F4 MCU。

要成为名为milo的运行时,该结构至少需要

$prefix/milo/adainclude
            |
            /adalib

adainclude/文件夹保存源代码,adalib/文件夹保存 .ali 文件和库(通常是 libgnat.a,因为它对用户隐藏)。

如果只需要这些,那么GNAT会使用 gprbuild --RTS=$prefix/milo 命令,非常简单。但在许多情况下,您可能希望更改编译器处理Ada选项和链接器命令的方式。这就是 runtime.xml 文件的工作,它是gprbuild配置文件。

Compiler 包中查看。

      Common_Required_Switches :=
         ("-mlittle-endian", "-mhard-float",
          "-mcpu=cortex-m4", "-mfpu=fpv4-sp-d16", "-mthumb");

为目标处理器适当的开关,将应用于使用此运行时的每个编译(您可能会说,-ffunction-sections-fdata-sections 呢?对此我无法给出一个好的答案!)

请参阅链接器包中的内容。

      for Required_Switches use Linker'Required_Switches &
        ("${RUNTIME_DIR(ada)}/adalib/libgnat.a") &
        Compiler.Common_Required_Switches &
        ("-nostdlib", "-lm", "-lgcc", "-lc");

      for Required_Switches use Linker'Required_Switches &
        ("-T", "${RUNTIME_DIR(ada)}/adalib/stm32f407-flash.ld");

其中第一部分告诉链接器使用$prefix/milo/adalib/libgnat.a,第二部分(其实可以和第一部分合并,现在我看来)告诉链接脚本使用代替内置于编译器中的那个。
我认为这里有一个有用的补充:--gc-sections&之所以存在是因为这是一个XML文件,需要对&进行转义处理。

0

最终我作弊了,创建了一个符号链接

ln -s libmilo.a libgnat.a

如果有更好的方法,请发帖!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接