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.

[参考译文] GNU ARM 工具-链接器

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/677126/gnu-arm-tools---linker

您好!

我将使用适用于 A15的 GNU 工具(使用 TDA2xx SOC)。

1.我有 本通用(可能是旧版) GNU 连接器手册,其中有一条注释:

"。 请注意、如果该段未分配 VMA、链接器也会使用 lma 区域作为 VMA 区域。 "


最近、我查看了 ARM GNU 软件包(在 gcc-arm-none-eabi-4_9-2015q3软件包中)附带的 ld pdf、我在本文档的任何位置都找不到此注释。

这是否意味着上述说明不再适用、如果我想确定分配、我必须同时指定 LMA 和 VMA 区域 (我不想将 LMA 保留为未定义、因为它可以使用之前段的 VMA-LMA 偏移来计算它、而这可能不是我想要的、所以我想控制它)? -同样的答案是否也适用于 TI 链接器?

2.

您能否解释一下、如果在 输出段块(在输出段块之外)之间进行读取/设置(在每个段可能具有不同的存储器区域)、段位置计数器(适用于 GNU 和 TI 链接器)的值和行为应该是什么?  

根据为分配值的文档。 运算符定义以下输出段的起始地址(如果不是为段专门设置的)-当段被分配到不同的区域时、这是如何工作的?

"。。 链接器假定对进行了分配。 正在设置以下输出段的起始地址..."

请您对此进行解释和详细阐述。

3.

将输入段设置为输出段时、 如果我使用的语法*(.text)、我会看到它仅应用所有.text 输出段、不考虑任何.text.xxxx 输入段、并且为其创建了子组和专用输出段-因此会分配存储器区域 text.xxxx 由链接器根据内部逻辑确定、这可能不是预期的逻辑。

在 A15链接器脚本示例中,我 看到.text 仅引用*(.text),而对于.data,例如,有两个.data 的引用 (因为这是输出段的名称,所以将为其分配同名的输入信息)和所有.data.xxxx (*(.data.*)):

.text:{*(.text)}> MEM1
.data:{*(.data.*)} >MEM2

为什么.text 输出段不包含*(.text.*)? 您能解释一下吗? 我在上述理解上是否有误?

4.

TI 链接器有一个 GROUP 选项来 强制连续分配多个输出段、GNU 链接器是否有类似的内容(我找不到一个)?

谢谢

家伙

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

    我们将把此主题移至 TI 编译器论坛。 此外、可以在 Linaro 论坛上查看有关 GNU 编译器行为的一般性问题。

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

    我对自己对 TI 连接器命令文件的了解充满信心。  我对 GCC 链接器脚本的信心要小得多。  但是、由于没有其他人在这里回答、我将会给出我能得到的指示灯。

    [引用 user="Guy Mardiks"]这是否意味着上述注释不再适用,我必须同时指定 LMA 和 VMA 区域

    这种可能性极小。  GCC 链接器中类似的更改会导致该链接器对字段中已有的许多链接器脚本的行为有所不同。

    Guy Mardiks 说:
    同样的答案是否也适用于 TI 链接器?

    对于 TI 链接器、VMA 对应于运行地址、而 LMA 对应于加载地址。  默认情况下、它们匹配。  您只能通过显式分配不同的运行和加载来使它们不同。

    [引用 user="Guy Mardiks">如果在 输出段块(输出段块之外)之间读取/设置了段位置计数器(适用于 GNU 和 TI 链接器)的值/行为(适用于 TI 链接器)、其中每个段可能具有不同的存储器区域、您能解释一下该段位置计数器的值和行为是什么?  [/报价]

    TI 链接器在段之间没有位置计数器的概念。

    在 GCC 链接器脚本中、如果为段显式指定存储器区域、则会忽略位置计数器值。

    [引用 user="Guy Mardiks"]

    .text:{*(.text)}> MEM1
    .data:{*(.data.*)} >MEM2

    为什么.text 输出段不包含*(.text.*)?

    [/报价]

    我相信您能正确地总结这两条线的工作方式。  我不知道您的示例脚本为什么这样做。  它来自哪里?  尽可能具体。  软件包、版本等等。  我的目标是找到负责该脚本的团队、并向他们提问。

    Guy Mardiks 说:
    TI 链接器有一个 GROUP 选项 来强制连续分配多个输出段,GNU 链接器是否存在类似的内容

    我犹豫回答,因为虽然我认为我知道,但我在文件中找不到明确说明这一点的任何东西。 我认为您不需要在 GCC 链接器脚本中使用 GROUP。  我确信、如果您依赖于地址分配的位置计数器方法、段将按照您编写的顺序进行分配。  当您将多个段分配到同一存储器区域时、我怀疑它们也是按照相同的顺序执行的。  这是我在文档中无法确认的最后一点。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的乔治:
    不幸的是、我不记得在哪里看到了具有.text 和.data 不同段语法的示例-当我看到它时感觉很奇怪、所以我想问一下。
    不过、您可以看到、一些示例同时具有*(.sec)和*(.sec*)、有些示例仅具有
    *(.sec)。 根据我回忆的内容(从我之前做的工作中)、有编译器选项为每个变量/函数分配一个其自己的名为 secName.varName / secName.funcname 的段、这有助于未使用的函数和变量删除过程。 如果没有提到*(.secName.*)、这是否会导致这些函数/变量不被放置在所需的存储器区域上? 如果存储器区域很重要、则添加*(.sec*)就像必须添加的一样-您可以对此提供输入吗? (除非我在任何地方都没有看到过这一点,否则所有 Sec*始终以秒为单位放置,如果没有其他特定的分配)?

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

    很抱歉耽误你的时间。

    我缺乏 GCC ARM 编译器的相关经验、因此可能允许我在摘要中回答此问题。  我需要知道编译器通常生成的段名。  因此、我怀疑我可以对这些行的编写方式进行有教育意义的猜测。  当我尝试查找使用的段名时、我只能找到模糊的文档。  显然、此详细信息留给每个 GCC 编译器中的特定配置机制、从未明确阐明。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、谢谢。
    您能否与 GNU Guys (Linaro 论坛?)一起询问 以了解链接器行为和逻辑?

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

    此时、我认为直接与 GCC ARM 团队合作是有道理的。  请访问 support.linaro.org。  单击"注册"链接以申请帐户。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。
    (我之前没有尝试注册、因为我从之前的回答中得到的印象是、没有人可以注册到该表)