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.
您好!
我将使用适用于 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 连接器命令文件的了解充满信心。 我对 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。 我确信、如果您依赖于地址分配的位置计数器方法、段将按照您编写的顺序进行分配。 当您将多个段分配到同一存储器区域时、我怀疑它们也是按照相同的顺序执行的。 这是我在文档中无法确认的最后一点。
谢谢、此致、
乔治
很抱歉耽误你的时间。
我缺乏 GCC ARM 编译器的相关经验、因此可能允许我在摘要中回答此问题。 我需要知道编译器通常生成的段名。 因此、我怀疑我可以对这些行的编写方式进行有教育意义的猜测。 当我尝试查找使用的段名时、我只能找到模糊的文档。 显然、此详细信息留给每个 GCC 编译器中的特定配置机制、从未明确阐明。
谢谢、此致、
乔治
此时、我认为直接与 GCC ARM 团队合作是有道理的。 请访问 support.linaro.org。 单击"注册"链接以申请帐户。
谢谢、此致、
乔治