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.
工具/软件: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 分配到段的逻辑和行为感到困惑、不知道我可以依赖什么
非常感谢您提供的任何帮助...
谢谢
家伙