首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改GNAT运行时名称

更改GNAT运行时名称
EN

Stack Overflow用户
提问于 2022-03-08 11:33:35
回答 2查看 121关注 0票数 4

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

但是,只有当自定义运行时名为'gnat‘并编译为'libgnat.a’时,才能再次链接自定义运行时,如果我称它为“libgnat.a”,则会得到ld错误:

/home/mark/opt/GNAT/2021/bin/../libexec/gcc/x86_64-pc-linux-gnu/10.3.1/ld:找不到-lgnat

对于如何配置它,我可以使用不同的名称,有什么想法吗?

下面是运行时的项目文件(大部分来自OSdev)

代码语言:javascript
复制
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;

下面是我尝试使用这个运行时的项目

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

发布于 2022-03-08 22:05:23

有关运行时的示例,请参见这里,其名称为stm32f4,用于STMicroelectronics中基于Cortex M4F的STM32F4 MCU。

要成为名为milo的运行时,结构至少必须是

代码语言:javascript
复制
$prefix/milo/adainclude
            |
            /adalib

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

如果仅此而已,那么小虫就会对gprbuild --RTS=$prefix/milo很满意。但是在可能的情况下,您需要改变编译器处理Ada选项和链接器命令的方式。这是runtime.xml文件的工作,它是一个gprbuild配置文件。

在包Compiler中,请参见

代码语言:javascript
复制
      Common_Required_Switches :=
         ("-mlittle-endian", "-mhard-float",
          "-mcpu=cortex-m4", "-mfpu=fpv4-sp-d16", "-mthumb");

对于适合于目标处理器的开关,它将应用于使用此运行时进行的每一次编译(您可能会说,-ffunction-sections-fdata-sections怎么办,我不会给您一个好的答案!)

在包Linker中,请参见

代码语言:javascript
复制
      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文件,而&需要转义。

票数 3
EN

Stack Overflow用户

发布于 2022-03-08 12:13:31

我以作弊告终,并创建了一个象征性的链接

-s libmilo.a libgnat.a

如果有更好的方法,请张贴!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71394362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档