This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器:TDA2XX A15 GNU 连接器段分配问题

Guru**** 2041660 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/684282/compiler-tda2xx-a15-gnu-linker-section-allocation-problem

工具/软件:TI C/C++编译器

您好!

使用 GNU 工具编译到 TDA2xx 上的 ARM A15

我正在尝试将汇编代码分配到特定位置。

我编写的汇编代码中  

.section .mysec

在链接器文件中、我有:

存储器


  my_MEM (RWIX):org =(0x40300000)、len =(0x10000)  

部分{

mysec (0x40300000):

  Keep (*(.mysec))
  Keep (*(.mysec.*))

.text  :{*(.text)*(.text.*)}  位于>my_MEM

在查看结果映射文件时、我可以看到.mysec 已正确分配了适当的大小、但出于某些原因、.text 也被分配到相同的位置。

从映射文件:

mysec0x40300000 0xdc
*(.mysec)
mysec 0x40300000 0xdc  /src/my_tda2xx_init.o
0x40300000 my_Start
0x403000a0 JU跳_MAIN
0x403000a4 CLEAR_BSS_Section
*(.mysec.*)

公共
*(.public.*)

初始化
*(.init.*)

.text 0x40300000 0x1982c
*(.text)
.text 0x40300000 0x1f0 ./src/exceptionhandler.o
0x40300000 SVC_Handler
0x40300078 IRQHandler
0x40300118 FIQHandler
0x403001a8 AbortHandler
0x403001c8 UndefInstHandler
.text 0x403001f0 0x48 ./src/sbl_lib_tda2xx_hs_support.o
0x403001f0 SBLLibHSSecureEntryAsm

(笑声)

具有“重载函数”代码的汇编语言(即 IRQHandler ...) 仅在开始时定义.text

我不明白链接器为什么这么做- GNU 链接器是否不会将绝对地址识别为存储器的一部分?

请帮助

谢谢

家伙

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这看起来像是 ARM GCC 链接器中的错误。  我复制了它。  我从未针对 ARM GCC 链接器提交过错误、因此下一步是学习如何执行此操作。

    记住这种可能性... 这可能不是一个错误、而是某种预期行为。  如果是这种情况、则提交错误应该会导致解释。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、谢谢。
    在深入探究之后、我发现我还必须为 GNU AS (汇编)中的命名段设置适当的标志、 否则、默认情况下、该段设置为未分配段-这说明了链接器为何忽略该段并将另一个段放置在同一地址范围内。
    设置标志后、它似乎按预期工作。

    谢谢
    家伙

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    那么、我没有提出错误是一件好事。  请显示用于为段设置适当标志的语法。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我使用了:

    .section .mysec、"ax"、%progbits (因为我需要代码段)。

    您可以看到中的所有标记都是手动标记,需要记住的重要一点是,如果没有设置标记,则默认为未分配的段。

    我仍然遇到 GNU 链接器问题。 我当时的假设是、不能保证输出段在存储器中的分配顺序-这就是 TI 链接 器具有 GROUP 关键字的原因。

    不过、对于 GNU 连接器段、似乎始终按照它们在链接器脚本文件中的外观顺序进行映射(分配给相同的存储器区域时)。 此外、如果为段指定特定的起始(VMA)地址、链接器会始终将段放在该地址上、并且不会检查是否在该地址分配了任何之前的段、这也会有效地创建覆盖段。 对于加载地址、链接器似乎也始终按照段外观的顺序分配加载地址、如果指定了特定的加载地址、 如果已分配上一个段、并且地址处于该范围内、则会发出错误-也就是说、它不会首先分配具有特定地址的段、而是解析其余部分)。

    此外、在指定唯一的 VMA 时、我还必须将段与存储器区域关联、否则、它将尝试在相同的地址上加载下一个段、这会导致错误:

    这会导致将.text 和.sec1加载到相同地址时出错

    sec1 (origin (MEM1)):

    *(.sec1)

    .text :{*(.text)*(.text.*)}  ,位于> MEM1

    虽然这似乎还不错:

    sec1 (origin (MEM1)):

    *(.sec1)

    }> MEM1

      .text :{*(.text)*(.text.*)}  ,位于> MEM1

     

    我无法找到任何实际描述并说明这是行为的文档 、如果您能够确认/反驳这一点、并且还能解释 GNU 链接器如何实际设置的 VMA 和 LDA 地址、那将是很棒的 章节。

    我真的对链接器将  VMA 和 LMA 分配到段的逻辑和行为感到困惑、不知道我可以依赖什么  

    非常感谢您提供的任何帮助...

     

    谢谢

    家伙