keil 5 armlink 链接错误和警告解释大全

L6000U``:``内存不足。

RVCT v4.0 及更早版本会报告此错误。有关出现此错误的原因和可能的解决方案的更多详细信息,请参阅错误 L6815U 的说明。

L6001U``:``无法从文件读取<文件名>。

L6002U``:``无法打开文件<文件名>: <原因>

这表示链接器无法打开链接器命令行上指定的文件。这可能表示访问文件时出现问题或命令行出现错误。此消息的一些常见示例包括:

复制代码
`L6002U: Could not open file /armlib/{libname}: No such file or directory
`

使用 --libpath 指定库路径,或将 ARMCC5LIB 环境变量设置为 \libinstall_directory

注意

在 ARM 编译器 v5.0 及更高版本中,armlink 不需要设置 ARMCC5LIB 环境变量。

复制代码
`Error : armlink : L6002: Could not open file errors=ver.txt
`

这是由于 errors=ver.txt 前面缺少双破折号 (--) 引起的。如果不在选项前面加上 ---,则链接器会将它们视为输入文件,并且链接步骤失败,因为它无法加载所有指定的文件。

请参阅《armlink 用户指南》中的以下内容:

--libpath=路径列表.

请参阅《入门指南》中的以下内容:

工具链环境变量.

L6003U``:``无法写入文件 <filename>。

读取、打开或写入指定文件时发生文件 I/O 错误。

L6004U``:``<library>的库成员列表<list>不完整。

如果库对象列表中有空格,则可能会发生这种情况。

以下示例失败,出现致命错误:L6004U:x.lib 的成员列表中缺少库成员:

复制代码
`armlink x.lib(foo.o, bar.o)
`

以下示例成功:

复制代码
`armlink x.lib(foo.o,bar.o)
`

另一个不太常见的原因是库损坏,或者可能是格式不受支持的库。

L6005U``:``<library>的成员列表末尾的额外字符。

L6006U``:``未使用执行区域 <regionname> 的 OVERALIGN 属性指定过度对齐值。

请参阅《armlink 用户指南》中的以下内容:

L6007U``:``无法识别文件格式<文件名>。

链接器可以识别 ELF 格式的对象文件和 AR 格式的库文件。指定的文件已损坏,或者是链接器无法识别的文件格式。

L6008U``:``无法识别 <lib> 中成员 <mem> 的格式。

链接器可以识别 ELF 文件格式的库成员对象。指定的库成员已损坏,或者采用链接器无法识别的文件格式。

L6009U``:``文件<文件名>:字节序不匹配。

指定文件或对象的字节序与其他输入文件的字节序不匹配。链接器可以在单个链接步骤中处理大端或小端对象的输入,但不能处理某些大端和一些小端对象的混合输入。

L6010U``:``无法将 stderr 重新打开到文件 <文件名>: <原因>

读取、打开或写入指定文件时发生文件 I/O 错误。

L6011U无效的整数常量:<number>。

指定非法整数常量会导致这种情况。整数可以以十六进制格式输入,前缀为 &0x0X

L6015U``:``找不到任何要链接的输入文件。

必须为链接器提供至少一个要链接的目标文件。

例如,如果您尝试与以下链接:

复制代码
`armlink lib.a -o foo.axf
`

链接器报告此错误。

例如,您必须改用:

复制代码
`armlink foo_1.o foo_2.o lib.a -o foo.axf
`

L6016U``:``对象/库 <object> 中的符号表丢失/损坏。

当与使用 GNU 工具构建的库链接时,可能会发生这种情况。这是因为 GNU ar 可以生成不兼容的信息。

解决方法是将 ar 替换为 armar 并使用相同的命令行参数。或者,可以通过使用 armar -s 重建符号表来恢复错误。

L6017U``:``库<库>符号表包含无效条目,偏移量为 0x<offset>处没有成员。

库可能已损坏。尝试重建它。

L6018U``:``<文件名>不是有效的 ELF 文件。

L6019U``:``<文件名>不是有效的 64 位 ELF 文件。

L6020U``:``<filename> 不是有效的 32 位 ELF 文件。

L6022U``:``Object <objname> 有多个<table>。

对象文件有故障或已损坏。这可能表示编译器错误。请联系您的供应商。

L6024U``:``库 <library> 包含无效的成员名称。

指定的文件不是有效的库文件,有故障或已损坏。尝试重建它。

L6025U``:``无法从非库文件 <library>中提取成员。

指定的文件不是有效的库文件,有故障或已损坏。尝试重建它。

L6026U``:``ELF 文件<文件名>既没有小端编码也没有大端编码

ELF 文件无效。尝试重建它。

L6027U``:``<objname>(<secname>) 中的重定位 #<rel_class>:<rel_number> 类型无效/未知。

这可能表示编译器错误。请联系您的供应商。

L6028U``:``<objname>(<secname>) 中的重定位 #<rel_class>:<rel_number> 的偏移无效。

这可能表示编译器错误。请联系您的供应商。

L6029U``:``<objname>(<secname>) 中的重定位 #<rel_class>:<rel_number> 是无效/缺少符号。

重新定位涉及以下任一符号:

  • 对象符号表中无效或缺失

  • 不适合由搬迁使用的符号。

这可能表示编译器错误。请联系您的供应商。

L6030U``:``区域 <regname> 的过度对齐<过度对齐>必须至少为 4 且 2 的幂

请参阅《armlink 用户指南》中的以下内容:

L6031U``:``无法打开散点描述文件<文件名>:<原因>

尝试打开指定的文件时发生 I/O 错误。这可能是因为文件名无效。

L6032U``:``<对象中找不到无效的<文本> <值>(最大<max_value>值>

L6033U``:``<objname>中的符号<symbolname>是相对于无效部分定义的。

L6034U``:``<objname> 中的符号<symbolname> 的值无效。

这通常是由于截面相对符号的值超出截面边界所致。

L6035U``:``ZI 部分 <objname>(<secname>) 中的 Relocation #<rel_class>:<rel_number> 类型无效。

除 R_ARM_NONE 类型外,ZI 部分不能有其他位置。

L6036U``:``无法关闭文件<文件名>:<原因>

关闭指定文件时发生 I/O 错误。

L6037U``:"``<arg>"不是选项"<option>"的有效参数。

该参数对此选项无效。这可能是由于拼写错误,或者是因为使用了不受支持的参数缩写。

L6038U``:``无法创建临时文件来写入更新的 SYMDEFS。

创建存储 SYMDEFS 输出所需的临时文件时发生 I/O 错误。

L6039W``:``从 <objname>(<secname>) 中的 #<rel_class>:<rel_number> 重新定位到 <symname>。跳过 R 型搬迁的创建。对于类型 <rel_type>,不存在相应的 R 型重定位。

--reloc 用于包含没有相应 R 类型重定位的重定位的对象。

L6041U``:``发生内部错误(<线索>)。

请联系您的供应商。

L6042U``:``<objname>(<secname>) 中的 Relocation #<rel_class>:<rel_number> 是映射符号 (#<idx>, Last Map Symbol = #<last>)。

不允许对制图符号进行重定位。这可能表示编译器错误。请联系您的供应商。

L6043U``:``<objname>(<secname>) 中的重定位 #<rel_class>:<rel_number> 与超出范围的符号 (#<val>, Range = 1-<max>) 有关。

只能使用 (1-n) 范围内的符号进行重定位,其中 n 是符号的数量。

L6047U``:``此映像的大小(<actual_size> 字节)超出了此版本链接器允许的最大值

L6048U``:``链接器无法继续链接步骤 (<id>)。此版本的链接器不会创建此映像。

L6049U``:链接器无法继续链接步骤 (<id>)。此版本的链接器不会与一个或多个给定库链接。

L6050U``:``此映像的代码大小(<actual_size> 字节)超出了此版本链接器允许的最大值。

L6058E``:解析链接器脚本 <script> 在第 <lineno> 行时出错: <token>

链接 ld 脚本在行号处存在语法错误。

请参阅《armlink 用户指南》中的以下内容:

armlink 中的 GNU ld 脚本支持.

L6064E``:``ELF 可执行文件<文件名>在命令行上作为输入给出

这可能是因为您指定了目标文件作为编译器的输出,而没有指定 -c 编译器选项。例如:

armcc file.c -o file.o

armlink file.o -o file.axf

请参阅《armcc 用户指南》中的以下内容:

-c.

L6065E``:``加载区域<名称>(大小<大小>)大于最大可写连续块大小0x80000000。

链接器尝试写入大于 2GB 的段。段的大小限制为 2GB。

L6175E``:``EMPTY 区域 <regname> 不能有任何节选择器。

L6176E``:``没有 EMPTY 属性的区域 <regname>不能使用负max_size。

只允许具有 EMPTY 属性的区域具有负max_size

L6177E``:``负max_size不能用于区域 <regname>,它使用基址的 +offset 形式。

使用 +offset 形式的基址的区域不允许具有负的最大大小。

L6188E``:``特殊部分 <sec1> 乘以 <obj1> 和 <obj2>。

特殊部分是只能使用一次的部分,例如"Veneer$$Code"。

L6195E``:``无法为区域 <regname> 指定"<attr1"和"<attr2>>

请参阅《armlink 用户指南》中的以下内容:

L6200E``:``符号<符号名称>乘以 <object1> 和 <object2>。

一个常见的例子:

复制代码
`Symbol __stdout multiply defined (by retarget.o and stdio.o).
`

这意味着 retarget.o 和 stdio.o 中存在两个相互冲突的 __stdout 定义。retarget.o 中的那个是你自己的定义。stdio.o 中的那个是默认实现,可能是无意中链接的。

stdio.o 包含许多符号定义和文件函数的实现,如 fopenfclosefflush

stdio.o 被链接,因为它满足一些未解析的引用。

要确定 stdio.o 被链接的原因,必须使用 --verbose link 选项开关。例如:

复制代码
`armlink [... your normal options...] --verbose --list err.txt
`

然后研究 err.txt,以准确了解链接器链接的内容、从何处以及为什么。

您可能需要:

  • 消除 fopenfclosefflush 等调用

  • 重新实现 _sys_xxxx 系列函数。

请参阅 ARM C 和 C++ 库和浮点支持用户指南中的以下内容:

定制 C 和 C++ 库中的输入/输出函数.

L6201E``:``对象 <objname> 包含多个条目部分。

输入对象指定多个入口点。使用 --entry 命令行选项选择要使用的入口点。

请参阅《armlink 用户指南》中的以下内容:

--entry=位置.

L6202E``:``<objname>(<secname>) 无法分配给非根区域"<regionname>"

根区域是执行地址与其加载地址相同的区域。因此,该区域不需要通过分散加载初始化代码进行移动或复制。

某些部分必须放置在图像的根区域中,包括:

  • __main.o.

  • 链接器生成的表 (Region$$Table)。

  • 从库中散射加载 (__scatter*.o) 对象。

  • 解压缩库中的 (__dc*.o) 对象。

如果必需的部分未放置在根区域中,则链接器将报告,例如:

复制代码
`anon$$obj.o(Region$$Table) cannot be assigned to a non-root region 'RAM'.
`

可以使用 InRoot$$Sections 在根区域中包含所有必需的部分:

复制代码
`ROM_LOAD 0x0000 0x4000
{
  ROM_EXEC 0x0000 0x4000 ; root region
  {
    vectors.o (Vect, +FIRST) ; Vector table
    * (InRoot$$Sections) ; All library sections
                         ; that must be in a root region
                         ; for example, __main.o, __scatter*.o,
                         ; dc*.o and * Region$$Table
  }
  RAM 0x10000 0x8000
  {
    * (+RO, +RW, +ZI) ; all other sections
  }
}
`

L6203E``:``入口点 (<address>) 位于非根区域 <regionname> 内。

映像入口点必须与映像根区域中的有效指令相对应。

L6204E``:``入口点(<地址>)不指向指令。

使用 --entry 命令行选项指定的映像入口点必须与映像根区域中的有效指令相对应。

请参阅《armlink 用户指南》中的以下内容:

--entry=位置.

L6205E``:``入口点 (<address>) 必须与 ARM 指令的字对齐。

之所以显示此消息,是因为使用 --entry 命令行选项指定的图像入口点未与单词对齐。例如,您指定了 --entry=0x8001 而不是 --entry=0x8000

请参阅《armlink 用户指南》中的以下内容:

--entry=位置.

L6206E``:``入口点(<地址>)位于图像外部。

使用 --entry 命令行选项指定的映像入口点位于映像外部。例如,您可能指定了 0x80000 而不是 0x8000 的条目地址,如下所示:

armlink --entry=0x80000 test.o -o test.axf

请参阅《armlink 用户指南》中的以下内容:

--entry=位置.

L6208E``:--entry 命令的参数无效:"<arg>"

请参阅《armlink 用户指南》中的以下内容:

--entry=位置.

L6209E``:``为 --entry 指定的偏移常量无效 (<arg>)

请参阅《armlink 用户指南》中的以下内容:

--entry=位置.

L6210E``:``图像不能有多个入口点。(<地址1>,<地址2>)

一个或多个输入对象指定图像的多个入口点。使用 --entry 命令行选项选择要使用的入口点。

请参阅《armlink 用户指南》中的以下内容:

--entry=位置.

L6211E``:``截面选择不明确。对象 <objname> 包含多个部分。

在包含多个 AREA 的汇编程序对象上使用链接器选项 --keep 时,可能会发生这种情况。链接器必须知道要保留哪个 AREA

要解决此问题,请使用多个 --keep 选项来指定要保留的 AREA 的名称,例如:

复制代码
` --keep boot.o(vectors) --keep boot.o(resethandler) ...
`

注意

使用具有多个 AREA 的汇编文件可能会在其他地方产生其他问题,因此最好避免这种情况。

L6213E``:``多个 不允许第一节 <object2>(<section2>)。 <object1>(<section1>) 已存在。

只允许一个 FIRST 部分。

L6214E``:``多个 不允许最后一节 <object2>(<section2>)。 <object1>(<section1>) 已存在。

只允许一个 LAST 部分。

L6215E``:--First/--Last的符号选择不明确。符号 <symbol> 有多个定义。

请参阅《armlink 用户指南》中的以下内容:

L6216E``:``不能对不连续截面使用基数/限值符号 <secname>

编译器生成的异常处理索引表被赋予 section name 。有关更多信息,请参阅 。ARM 架构的异常处理 ABI.

在链接时,这些表必须放置在相同的执行区域中,并且是连续的。如果在散点文件中使用特定的选择器模式以非连续方式显式放置这些部分,则可能会出现此错误消息。例如:

复制代码
`LOAD_ROM 0x00000000
{
  ER1 0x00000000
  {
    file1.o (+RO) ; from a C++ source
    * (+RO)
  }
  ER2 0x01000000
  {
    file2.o (+RO) ; from a C++ source
  }
  ER3 +0
  {
    * (+RW, +ZI)
  }
}
`

如果异常处理索引表同时位于 file1.o 和 file2.o 中,则可能会产生以下错误,因为链接器无法将它们放在单独的区域中:

复制代码
`Error: L6216E: Cannot use base/limit symbols for non-contiguous section .ARM.exidx
`

此外,.init_array部分必须连续放置在同一区域内,以便可访问其底值和限制符号。

正确的代码是:

复制代码
`LOAD_ROM 0x00000000
{
  ER1 0x00000000
  {
    file1.o (+RO)   ; from a C++ source
    * (.ARM.exidx)  ; Section .ARM.exidx must be placed
                    ; explicitly, otherwise it is shared between
                    ; two regions and the linker is unable to
                    ; decide where to place it.
    *(.init_array)  ; Section .init_array must be placed
                    ; explicitly, otherwise it is shared between
                    ; two regions and the linker is unable to
                    ; decide where to place it.
    * (+RO)
  }
  ER2 0x01000000
  {
    file2.o (+RO)   ; from a C++ source
  }
  ER3 +0
  {
    * (+RW, +ZI)
  }
}
`

在此示例中,基数和限值符号包含在单个区域的.init_array中。

请参阅 ARM C 和 C++ 库和浮点支持用户指南中的以下内容:

C++ 初始化、构造和销毁.

L6217E``:<objname>(<secname>) 中对 <symbol> 进行重定位 #<rel_class>:<rel_number>。R_ARM_SBREL32重新定位到导入的符号

L6218E``:``未定义符号 <符号>(引用自 <objname>)。

一些常见的例子是:

  • 用户错误。引用了未定义或定义不正确的符号。

复制代码
`Undefined symbol __ARM_switch8 or __ARM_ll_<xxxx> functions 
`

帮助程序函数由编译器自动生成到目标文件中。

注意

但是,如果从帮助程序函数位于 h_xxx 库中的旧项目中链接对象,则仍会生成未定义的引用错误(h 表示这些是编译器帮助程序库,而不是标准 C 库代码)。

重新编译对象或确保链接器可以找到这些库。

  • 尝试从 C++ 中的函数或实体引用 C 中的函数或实体时。这是由 C++ 名称篡改引起的,可以通过将 C 函数标记为 extern "C" 来避免。

复制代码
`Undefined symbol thunk{v:0,-44} to Foo_i::~Foo_i() (referred from Bar_i.o)
`

符号 thunk{v:0,-44} 到 Foo_i::~Foo_i() 是围绕常规 Foo_i::~Foo_i() 的包装函数。

Foo_i 是其他基类的派生类,因此:

  • 它有一个基类 vtable,用于由指向该基类的指针引用
  • 基类 vtable 有一个用于 thunk 的条目
  • 当输出实际(派生类)析构函数时,将输出析构函数 thunk。

因此,为避免此错误,请确保定义此析构函数。
*

复制代码
`Undefined symbol main (referred from kernel.o)
`

链接器报告应用程序不包含 main() 函数。

请参阅《迁移和兼容性指南》中的以下内容:

RVCT v2.2 和 RVCT v3.0 之间的 C 和 C++ 库更改.

L6219E``:``<type> 节 <object1>(<section1>) 属性 {<attributes>} 与相邻节 <object2>(<section2>) 不兼容。

当违反链接器使用的默认排序规则(RO 后跟 RW 后跟 ZI)时,会发生此错误。这通常发生在使用 +FIRST+LAST 时,例如在散点文件中,试图在 RO 之前强制 RW。

L6220E``:``<type>区域<regionname>大小(<大小>字节)超过限制(<limit>字节)。

例:

复制代码
`Execution region ROM_EXEC size (4208184 bytes) exceeds limit (4194304 bytes).
`

如果在散点文件中为某个区域指定了(可选)最大长度,但放置在该区域中的代码和数据的大小已超过限制,则可能会发生这种情况。此错误可通过 --diag_suppress 6220 抑制。

例如,在使用 时可能会发生这种情况。在散点文件中带有 ALIGN 指令的 ANY num 选择器,以强制链接器插入填充。您可以使用 --any_contingency 选项来解决此问题。

请参阅《armlink 用户指南》中的以下内容:

L6221E``:``<type1> 区域 <regionname1> <范围为 [<>base1>,<limit1>) 与 <type2>区域 <regionname2> <addrtype2>范围为 [<base2>,<limit2>] 重叠。

即使分散加载描述文件中的信息和链接器生成的映射信息指示执行区域不重叠,也可能发生此错误。

在 RVCT v4.0 及更早版本中,链接器没有提供太多信息,使消息更难理解:

Warning L6221E: <type1> region <regionname1> overlaps with <type1> region <regionname2>

test.s 文件示例:

复制代码
`    AREA area1, CODE
    BX lr

    AREA area2, READWRITE, NOINIT
    SPACE 10

    AREA area3, READWRITE
    DCD 10
    END`

scatter.txt 文件示例:

复制代码
`LR1 0x8000
{
  ER1 +0
  {
    *(+ro)
  }
  ER2 +0
  {
    *(+zi)
  }
  ER3 +0
  {
    *(+rw)
  }
}`

内置:

复制代码
`armasm test.s
armlink -o test.axf --scatter scatter.txt test.o`

生成:

Warning: L6221E: Execution region ER2 with Execution range [0x00008004,0x00008010) overlaps with Execution region ER3 with Load range [0x00008004,0x00008008).

当执行区域基址与另一个区域的加载地址重叠时,链接器可能会发出警告消息 L6221E。这可能是由于散点文件不正确所致。图像的内存映射具有加载视图和执行视图,由分散加载文件描述。非 ZI 部分必须具有唯一的加载地址,并且在大多数情况下必须具有唯一的执行地址。从 RVCT v3.1 开始,链接器不再为 ZI 执行区域分配空间。因此,此警告可能是因为具有相对基址的负载区域 LR2 紧跟在负载区域 LR1 中的 ZI 执行区域之后。

由于重叠部分内部可能没有真实的代码或数据,因此警告可能是无害的。

从 RVCT v4.0 build 821 开始,您可以使用以下链接器选项来查找每个区域的地址以及与加载区域重叠的任何区域:

--load_addr_map_info --map --list=map.txt

您可以执行下列操作之一:

  • 仅当分析后可以确定执行区域不会损坏尚未复制到其执行区域地址的加载区域时,才忽略警告。此外,调试应用程序以确认它正确初始化和执行。

  • 调整执行区域的基址。

  • 使用 FIXED scatter-loading 属性可使加载区域和执行区域具有相同的基址。

请参阅《armlink 用户指南》中的以下内容:

L6222E``:``分部对象不能有多个 ENTRY 部分,即 <e_oname>(<e_sname>) 和 <oname>(<sname>)。

如果对象被链接在一起,形成一个部分链接的对象,则对象中只有一个部分可以具有入口点。

注意

在这种情况下,无法使用链接器选项 --entry 来选择其中一个入口点。

L6223E``:``在 Exec 区域 <region>1 和 <region2> 中找到 <objname>(<secname>) 不明确的选择器。

如果散点文件指定将 <objname>(<secname>) 放置在多个执行区域中,则会出现这种情况。使用通配符 (*) 时,可能会意外发生这种情况。解决方案是在散点文件中使选择更加具体。

L6224E``:``无法将 <objname>(<secname>) 放在任何执行区域中。

如果链接器无法将输入部分与散点文件中的任何选择器匹配,则会出现这种情况。您必须通过添加适当的选择器来更正散点文件。

请参阅《armlink 用户指南》中的以下内容:

使用链接器放置部分.

L6225E``:``编号 <str...>太长了。

L6226E``:``缺少区域 <regname> 的基址。

L6227E``:``不允许将 --reloc 与 --rw-base 一起使用而不使用 --split。

请参阅《armlink 用户指南》中的以下内容:

L6228E``:``应为"<str1>",找到"<str2>"。

L6229E``:``Scatter description <file>为空。

L6230E``:``多个执行区域(<region1>,<region2>)无法选择<secname>。

L6231E``:``缺少模块选择器。

L6232E``:``缺少截面选择器。

L6233E``:``未知截面选择器"+<selector>"。

L6234E``:``<ss> 必须遵循单个选择器。

例如,在散点文件中:

复制代码
`:
* (+FIRST, +RO)
:
`

+FIRST 表示将此(单个)部分放在首位。可以匹配多个部分(例如,+RO+ENTRY)的选择器不允许与 +FIRST(或 +LAST)一起使用。如果一起使用,则会生成错误消息。

L6235E``:``多个部分匹配选择器 - 不能全部为 FIRST/LAST。

请参阅《armlink 用户指南》中的以下内容:

L6236E``:``没有与选择器匹配的部分 - 没有部分是 FIRST/LAST。

分散文件将某个部分指定为 +FIRST+LAST,但该部分不存在,或者链接器认为该部分未使用,因此已被删除。使用链接器选项 --info unused 来显示从项目中删除了哪些对象。例:

复制代码
`ROM_LOAD 0x00000000 0x4000
{
 ROM_EXEC 0x00000000
 {
   vectors.o (Vect, +First) << error here
   * (+RO)
 }
 RAM_EXEC 0x40000000
 {
   * (+RW, +ZI)
 }
}
`

一些可能的解决方案是:

  • 确保在链接器命令行上指定 vectors.o

  • 使用 --keep vectors.o 链接以强制链接器不删除它,或使用 --no_remove 完全关闭此优化。ARM 不建议这样做。

  • ARM 建议将 ENTRY 指令添加到 vectors.s,以告知链接器它是应用程序的可能入口点。例如:

    复制代码
    `AREA Vect, CODE
    ENTRY ; define this as an entry point
    Vector_table
    ...
    `

    然后使用 --entry Vector_table 链接以定义代码的真正开始。

请参阅《armlink 用户指南》中的以下内容:

请参阅《armasm 用户指南》中的以下内容:

进入.

L6237E``:``<objname>(<secname>) 包含对未对齐数据的重定位。

L6238E``:``<objname>(<secname>) 包含从"<attr1>"函数到"<attr2>"函数 <sym> 的无效调用。

如果在目标代码中检测到堆栈对齐冲突,则会给出此链接器错误。ARM 体系结构的 ABI 表明代码在其接口上保持 8 字节堆栈对齐。这允许有效地使用 LDRDSTRD 指令(在 ARM 架构 5TE 及更高版本中)来访问八字节对齐的双精度和长数据类型。

~PRES8REQ8 等符号是对象的构建属性:

  • PRES8 表示对象保留堆栈的 8 字节对齐方式

  • ~PRES8 表示对象不保留堆栈的 8 字节对齐(~ 表示不)

  • REQ8 表示对象需要堆栈的 8 字节对齐。

此链接错误通常发生在两种情况下:

  • 汇编程序代码(不保留八字节堆栈对齐)调用编译的 C/C++ 代码(需要八字节堆栈对齐)。

  • 尝试将使用旧工具编译的旧对象与使用最新工具编译的对象链接。不具有这些属性的旧对象被视为 ~PRES8,即使它们实际上恰好保留了 8 字节对齐方式。

例如:

复制代码
`Error: L6238E: foo.o(.text) contains invalid call from '~PRES8' function to 'REQ8' function foobar
`

这意味着对象 foo.o(在名为 .text 的部分中)中有一个函数不保留 8 字节堆栈对齐,但它正在尝试调用需要 8 字节堆栈对齐的函数 foobar

可能遇到的类似警告是:

复制代码
`Warning: L6306W: '~PRES8' section foo.o(.text) should not use the address of 'REQ8' function foobar
`

引用外部符号的地址的位置。

有两种可能的解决方案可以解决此问题:

  • 重建所有对象/库。

    如果您有任何汇编程序文件,则必须检查所有指令是否保留 8 字节堆栈对齐方式,并在必要时更正它们。

    例如,更改:

    复制代码
    `STMFD sp!, {r0-r3, lr} ; push an odd number of registers
    `

    复制代码
    `STMFD sp!, {r0-r3, r12, lr} ; push even number of registers
    `

    如果所有指令都保留 8 字节堆栈对齐方式,则汇编程序会自动使用 PRES8 属性标记对象,因此不再需要将 PRESERVE8 指令添加到每个汇编程序文件的顶部。

  • 如果您有任何无法重新生成的旧对象/库,或者因为您没有源代码,或者因为不能重新生成旧对象(例如,出于资格/认证原因),则必须检查旧对象以检查它们是否保留八字节对齐方式。

    Use fromelf -c to disassemble the object code. C/C++ code compiled with ADS 1.1 or later normally preserves eight-byte alignment, but assembled code does not.

    If your objects do indeed preserve eight-byte alignment, then the linker error L6238E can be suppressed with the use of --diag_suppress 6238 on the linker command line.

    By using this, you are effectively guaranteeing that these objects are PRES8.

    The linker warning L6306W is suppressible with --diag_suppress 6306.

See the following FAQ:

Byte Stack Alignment.

L6239E``:``Cannot call non-interworking <t2> symbol '<sym>' in <obj2> from <t1> code in <obj1>(<sec1>)

Example:

复制代码
`Cannot call non-interworking ARM symbol 'ArmFunc' in object foo.o from THUMB code in bar.o(.text)`

此问题可能是由于 foo.c 未使用选项 --apcs /interwork 进行编译,以使 ARM 代码能够通过链接器生成的互通单板调用 Thumb 代码(以及 Thumb 到 ARM)。

L6241E``:``<objname>(<secname>) 不能使用"<attr1>"函数 <sym> 的地址,因为映像包含"<attr2>"函数。

使用 --strict 链接时,链接器会报告可能失败的条件作为错误,例如:

复制代码
`Error: L6241E: foo.o(.text) cannot use the address of '~IW' function main as the image contains 'IW' functions.
`

IW表示互通,~IW表示非互通。

L6242E``:``无法链接对象 <objname>,因为其属性与图像属性不兼容。

编译工具生成的每个对象文件都包含一组属性,这些属性指示生成该文件时使用的选项。链接器检查它处理的每个对象文件的属性。如果它发现属性与之前加载的目标文件的属性不兼容,则会生成此错误。

此错误有两个常见原因:

  • 使用不兼容选项编译的对象文件。例如:
    • 尝试将一个为 Cortex-A 处理器编译的文件与另一个为 Cortex-M 处理器编译的文件链接。
    • 尝试链接具有不兼容 FPU 选项的文件。
  • 链接使用不兼容 ABI 的旧工具链编译的对象。看旧对象和库是否与我的项目兼容?了解更多信息。

L6243E``:``选择器仅匹配已删除的未使用部分 - 没有部分是 FIRST/LAST。

与此选择器匹配的所有部分都已从图像中删除,因为它们未使用。有关更多信息,请使用 --info unused

L6244E``:``<type>区域 <regionname> 地址 (<addr>) 未在 <align> 字节边界上对齐。

L6245E``:``无法创建请求的 ZI 部分"<name>"。

<attr1>区域"<r1>"中的 L6248E:<objname>(<secname>)不能将 <rtype> 重新定位到 <attr2>区域"<r2>"中的 <symname>。

当您尝试生成与位置无关的 (PI) 代码时,可能会发生此错误。例如,请考虑以下代码:

复制代码
`#include <stdio.h>
char *str = "test";
int main(void)
{
    printf ("%s",str);
}
`

当您使用以下命令编译和链接它时:

复制代码
`armcc -c --apcs /ropi/rwpi pi.c
armlink --ropi --rwpi pi.o
`

链接器报告以下错误消息:

复制代码
`Error: L6248E: pi.o(.data) in PI region 'ER_RW' cannot have address type relocation to .conststring in PI region 'ER_RO'.
`

这是因为编译器会生成一个全局指针 str,该指针 str 必须初始化为 .conststring 节中字符串的地址。但是,绝对地址不能在 PI System 中使用,因此链接步骤失败。

若要解决此问题,必须重新编写代码以避免显式指针。您可以使用以下任一方法执行此操作:

  • 使用全局数组而不是全局指针,例如:

    复制代码
    `#include <stdio.h>
    const char str[] = "test";
    int main(void)
    {
        printf ("%s",str);
    }
    `
  • 使用本地指针而不是全局指针,例如:

    复制代码
    `#include <stdio.h>
    int main(void)
    {
        char *str = "test";
        printf ("%s",str);
    }
    `

注意

如果您使用的是指针数组,例如:

复制代码
`char * list[] = {"zero", "one", "two"};
`

链接器为数组中的每个元素报告一个单独的错误。在这种情况下,ARM 建议为列表声明一个二维数组,其中第一个维度是数组中的元素数,第二个维度是数组中元素的最大大小,例如:

复制代码
`char list[3][5] = {"zero", "one", "two"};
`

例如,您必须将 printf() 语句更改为:

复制代码
`printf("%s", list[1]);
`

请参阅编译器错误编号 1359。

L6249E``:``入口点(<地址>)位于多个部分。

L6250E``:``Object <objname> 包含特殊符号 <symbol> 的非法定义。

L6251E``:``对象 <objname> 包含对特殊符号 <symbol> 的非法引用。

L6252E``:--xreffrom/--xrefto 命令的参数无效:"<arg>"

L6253E``:``无效的 SYMDEF 地址:<编号>。

L6254E``:``无效的 SYMDEF 类型:<类型>。

symdefs 文件的内容无效。

请参阅《armlink 用户指南》中的以下内容:

Symdefs 文件格式.

L6255E``:``无法删除文件<文件名>:<原因>

尝试删除指定文件时发生 I/O 错误。该文件要么是只读的,要么是找不到的。

L6257E``:``<object>(<secname>) 无法分配给覆盖的执行区域"<ername>"。

此消息表示分散文件存在问题。

请参阅《armlink 用户指南》中的以下内容:

Scatter 文件语法.

L6258E``:``入口点(<地址>)位于叠加的执行区域中。

此消息表示分散文件存在问题。

请参阅《armlink 用户指南》中的以下内容:

Scatter 文件语法.

L6259E``:``保留字"<name>不能用作<类型>区域名称。

<name> 是保留字,因此请为您所在的地区选择其他名称。

L6260E``:``不允许使用多个同名 (<regionname>) 的加载区域。

此消息表示分散文件存在问题。

请参阅《armlink 用户指南》中的以下内容:

Scatter 文件语法.

L6261E``:``不允许使用多个同名 (<regionname>) 的执行区域。

此消息表示分散文件存在问题。

请参阅《armlink 用户指南》中的以下内容:

Scatter 文件语法.

无法从 <regtabregionname 中的<pi_or_abs>区域表寻址 <regionname> 的 L6263E``:<addr> 地址>

"区域表"包含 C 库初始化代码用于复制、解压缩或创建 ZI 的信息。当散点文件指定的图像结构无法由区域表描述时,会给出此错误消息。

当 PI 和非 PI 加载区域在同一映像中混合时,错误消息最为常见。

L6265E``:``非 PI 部分 <obj>(<sec>) 无法分配给 PI Exec 区域 <er>。

这可能是由于在链接器命令行上显式指定了错误的 ARM 库所致。也:

  • 删除 ARM 库的显式规范

  • 将库(例如 c_t.l)替换为正确的库。

L6266E``:``RWPI 第 <obj>(<sec>) 节不能分配给非 PI Exec 区域 <er>。

使用 --apcs=/rwpi 编译的文件放置在没有 PI 属性的执行区域中。

L6271E``:``为加载区域 <regname> 指定的两个或多个互斥属性

此消息表示分散文件存在问题。

L6272E``:``为执行区域指定的两个或多个互斥属性 <regname>

此消息表示分散文件存在问题。

L6273E``:``Section <objname>(<secname>) 具有互斥属性(READONLY 和 ZI)

此消息表示对象文件存在问题。

L6275E``:COMMON 部分 <obj1>(<sec1>) 未定义 <sym>(在 <obj2>(<sec2>) 中定义)

给定一组具有相同名称的 COMMON 部分,链接器将选择其中一个要添加到图像中,并丢弃所有其他部分。选定的 COMMON 截面必须定义由任何被拒绝的 COMMON 截面定义的所有符号,否则由被拒绝截面定义的符号将再次变为未定义。如果所选副本未定义被拒绝副本所定义的符号,则链接器将生成错误。此错误通常是由编译器错误引起的。请联系您的供应商。

L6276E``:``地址<地址>标记为 <s1>(来自 <sp1>(<obj1>) 通过 <src1>) 和 <s2>(来自 <sp2>(<obj2>) 通过 <src2>)。

对于给定地址,图像不能包含相互矛盾的映射符号,因为图像中每个单词的内容都唯一类型为 ARM ($a) 或 THUMB ($t) 代码、DATA ($d) 或 NUMBER。一个单词不可能既是 ARM 代码又是 DATA。这可能表示编译器错误。请联系您的供应商。

L6277E``:``未知命令"<cmd>"。

L6278E``:``缺少预期的 <str>。

L6279E``:``找到<sym>('<sel1>'和'<sel2>')的不明确选择器。

L6280E``:``无法使用给定的模式重命名 <sym>。

请参阅《armlink 用户指南》中的以下内容:

RENAME 转向文件命令.

L6281E``:``无法将 <sym1> 和 <sym2> 重命名为 <newname>。

请参阅《armlink 用户指南》中的以下内容:

RENAME 转向文件命令.

L6282E``:``无法将 <sym> 重命名为 <newname>,因为该名称的全局符号存在于 <obj> 中。

请参阅《armlink 用户指南》中的以下内容:

RENAME 转向文件命令.

L6283E``:``Object <objname> 包含对符号 <symbolname> 的非法本地引用。

对象不能包含对本地符号的引用,因为本地符号始终在对象本身中定义。

L6285E``:``不可重定位的负载区域<lr_name>包含 R 型动态重定位。在偏移量 0x<offset> 处的 <object>(<secname>) 中发现了第一个 R 型动态重定位。

如果两个单独的段之间存在 PI 引用,则会发生此错误,前提是两个段可以在运行时分开。当链接器发现这两个部分可以在运行时分开时,它会生成重定位(R 类型重定位),如果将部分从其静态链接地址移出,则可以解析该重定位。但是,链接器会错误地进行此重定位(出现错误 L6285E),因为 PI 区域不得相对于其他部分进行重定位,因为这会使位置无关的标准无效。

L6286E``:<objname>(<secname>) 中对 {symname|%s} 进行重定位 #<rel_number><rel_class>:。值 (<val>) 超出 (<rtype>) 的范围 (<范围>)

此错误通常发生在以下情况下:

  • 在手写汇编代码中,指令操作码中没有足够的位来保持符号的偏移量。

    例如,ARM 状态 LDRSTR 指令的偏移范围为 ±4095。

  • 当链接器难以在图像中的大型代码部分周围放置贴面时。

    当链接器将单板放置在非常大的部分附近时,它必须决定是将单板放置在该部分之前还是之后。当链接者放置单板时,它可能必须放置更多的单板,这些单板可以放置在原始单板和目标之间。这将增加单板与其目标之间的距离。

    连接器自动允许适度增加单板与其目标之间的距离。但是,在原始单板与其目标之间放置大量单板可能会导致目标移出范围。如果发生这种情况,链接器将生成消息 L6286E。

    若要解决此问题,可以将大型代码段从链接器放置许多贴面的区域移开。这可以通过将大截面放置在它们自己的区域中,或者使用散点加载描述文件中的 +FIRST 指令将它们放在它们所在的区域中来完成。

    例如:

    复制代码
    `LOAD 0x0A000000 0x1000000
    {
       ROM1 +0x0
       {
          *(+RO)
       }
    }
    `

    这可以更改为:

    复制代码
    `LOAD 0x0A000000 0x1000000
    {
       ROM1 +0x0
       {
          *(+RO)
       }
       ROM1A +0x0
       {
          large.o (+RO)
       }
    }
    `
  • 什么时候。ARM.exidx 异常处理索引表放置在不同的执行区域中,或者与异常处理代码相距太远。

    .ARM.exidx 异常处理索引表必须位于单个执行区域中。此外,从这些表到使用异常处理的C++代码C++距离必须在 -0x40000000 到 0x3fffffff 的范围内。否则,链接器将报告以下错误:

    L6286: Value(0x9ff38980) out of range(-0x9ff38980) out of range(-0x40000000 - 0x3fffffff) for relocation #0 (R_ARM_PREL31), wrt symbol xxx in XXXX.o(.ARM.exidx)

    此行为在 ARM 体系结构的异常处理 ABI (EHABI) 中指定。EHABI指出,R_ARM_PREL31搬迁,其中.ARM.exidx 使用,不使用最高位(位 31)来计算重定位。

    最可能的原因是必须访问 的 C++ 代码。ARM.exidx 部分,已拆分并放置在有效范围(-0x40000000 到 0x3fffffff)之外的单独执行区域。

    要解决此错误,如果在分隔的执行区域之间有内存,请将 .带有选择器 *(.ARM.exidx)。 例如:

    复制代码
    `LOAD_ROM 0x00000000
    {
       ER1 0x00000000   ; The distance from ER2 to ER1 is out of
       {                ; range. 
          file1.o (+RO) ; From a C++ source.
          * (+RO)
       }
       ERx 0x30000000
       {
          *(.ARM.exidx) ; ARM.exidx to ER1 and ER2 both in range.
       }
       ER2 0x60000000 
       {
          file2.o (+RO) ; From a C++ source.
       }
       ER3 +0
       {
          * (+RW, +ZI)
       }
    }`

    否则,请尝试将代码放置在离表足够近的执行区域(在 -0x40000000 到 0x3fffffff 的范围内)。

在其他情况下,请确保您安装了最新的修补程序下载.

有关详细信息,请参阅以下内容:

"错误:L6286E:值超出重新定位范围"是什么意思?

ARM 架构的异常处理 ABI.

L6287E``:``为 <objname>(<secname>) 指定的非法对齐约束 (<align>)。

为 ELF 对象指定了非法对齐方式。

L6291E``:``无法分配固定执行区域 <ername>加载地址:<addr>。加载地址必须大于或等于下一个可用的加载地址:<load_addr>。

请参阅《armlink 用户指南》中的以下内容:

执行区域属性.

L6292E``:``忽略为区域 <regname> 指定的未知属性"<attr>"。

此错误消息特定于具有 FIXED 属性的执行区域。FIXED表示使加载地址与执行地址相同。仅当执行地址大于或等于加载区域中的下一个可用加载地址时,链接器才能执行此操作。

请参阅《armlink 用户指南》中的以下内容:

L6294E``:``<type> region <regionname> 跨越 32 位地址空间(基<base>,大小 <size> 字节)。

此错误消息与分散文件的问题有关。

L6295E``:``在 <objname>(<secname>) 中与 <symname> 重新定位 #<rel_class>:<rel_number> SBREL 重定位要求映像为 RWPI

L6296E``:``特殊符号 <sym1> 的定义是非法的,因为符号 <sym2> 是绝对的。

请参阅 L6188E。

L6300W``:``公共截面<object1>(<section1>)大于其定义<object2>(<section2>)。

这可能表示编译器错误。请联系您的供应商。

L6301W``:``找不到文件<文件名>:<原因>

在默认目录中找不到指定的文件。

L6302W``:``忽略多个SHLNAME条目。

编辑文件中只能有一个 SHLNAME 条目。链接器仅接受第一个此类条目。所有后续的 SHLNAME 条目都将被忽略。

L6304W``:``忽略重复的输入文件<文件名>。

指定的文件名在输入文件列表中多次出现。

L6305W``:``图像没有入口点。(由于多项选择,未指定或未设置。

ELF 映像的入口点未指定,或者未设置,因为有多个部分链接了入口点。您必须使用链接器选项 --entry 来指定单个唯一条目,例如:

复制代码
`--entry 0x0
`

复制代码
`--entry <label>
`

标签形式是嵌入式系统的典型形式。

L6306W``:"``<attr1>"部分 <objname>(<secname>) 不应使用"<attr2>"函数 <sym> 的地址。

请参阅 L6238E。

L6307W``:``在 <objname>(<secname>) 中对 <sym> 进行重定位 #<rel_class>:<rel_num>。分支到未对齐的目标。

L6308W``:``在库 <libraryname> 中找不到任何与 <membername> 匹配的对象。

库中对象的名称在链接行上指定,但库不包含具有该名称的对象。

L6309W``:``Library <libraryname> 不包含任何成员。

在链接器命令行上指定了库,但该库不包含任何成员。

L6310W``:``找不到 ARM 库。

这通常是由于 --libpath 的参数不正确或环境变量 ARMCC5LIB 的无效值(如果已定义)引起的。

使用 --libpath 链接器选项或 ARMCC5LIB 环境变量设置正确的路径。Windows 安装的默认路径为:

\libinstall_directory

确保此路径不包含以下任何内容:

  • \armlib

  • \cpplib

  • 末尾的任何尾部斜杠 (\)。这些内容由链接器自动添加。

使用 --verbose--info 库显示链接器尝试查找库的位置。

请参阅《armlink 用户指南》中的以下内容:

请参阅《入门指南》中的以下内容:

L6311W``:``未定义符号<符号>(引用自 <objname>)。

请参阅 L6218E。

L6312W``:``空<类型>区域说明 <region>

L6313W``:``使用<oldname>作为截面选择器已过时。请改用<newname>。

例如,在散点文件中使用 IWV$$Code 已过时。将 IWV$$Code 替换为 Veneer$$Code

L6314W``:``没有部分与模式匹配 <module>(<section>)。

例如:

复制代码
`No section matches pattern foo.*o(ZI).
`

这可能是由以下任何原因引起的:

  • 文件 foo.o 在 scatter 文件中提及,但未在链接器命令行中列出。要解决此问题,请将 foo.o 添加到链接行。

  • 您尝试使用分散文件放置 foo.o 的 ZI 数据,但 foo.o 不包含任何 ZI 数据。要解决此问题,请从 scatter 文件的 foo.o 行中删除 +ZI 属性。

  • 您已在源代码中使用 __attribute__((at()))address 将代码和数据放置在特定地址。您还指定了 *(.ARM.__AT_)地址 ,但您尚未将地址指定为八位十六进制数字。例如,如果在源代码中指定 __attribute__((at(0x10000))),则必须将节名称指定为 *(.ARM.__AT_0x00010000) 在散点文件中。

请参阅《armlink 用户指南》中的以下内容:

L6315W``:``忽略对象 <objname> 中的多个构建属性符号。

一个对象最多可以包含一个绝对的 BuildAttribute$$... 符号。链接器仅接受对象符号表中的第一个此类符号。所有后续的都会被忽略。

L6316W``:在第 <sec_no> 节中忽略对象 <objname> 中的多个构建属性符号

一个对象最多可以包含一个适用于给定部分的 BuildAttribute$$... 符号。链接器仅接受对象符号表中的第一个此类符号。所有后续的都会被忽略。

L6317W``:``<objname>(<secname>) 不应使用"<attr1>"函数 <sym> 的地址,因为映像包含"<attr2>"函数。

L6318W``:``<objname>(<secname>) 包含非代码符号 <sym> 的分支。

此警告意味着在(通常是汇编程序)文件中,同一文件中有一个指向非代码符号(在另一个 AREA 中)的分支。这很可能是标签或地址的分支,其中有数据,而不是代码。

例如:

复制代码
` AREA foo, CODE
 B bar
 AREA bar, DATA
 DCD 0
 END
`

这将导致以下消息:

复制代码
`init.o(foo) contains branch to a non-code symbol bar.
`

如果目标没有名称:

复制代码
`BL 0x200 ; Branch with link to 0x200 bytes ahead of PC
`

将显示以下消息:

复制代码
`bootsys.o(BOOTSYS_IVT) contains branch to a non-code symbol <Anonymous Symbol>.
`

链接 GCC 生成的对象时,也会出现此警告。GCC 对每个对象内部的引用使用链接器重定位。这些重定位的目标可能没有适当的映射符号,这些符号允许链接器确定目标是代码还是数据,因此会生成警告。相比之下,armcc 在编译时解析所有此类引用。

L6319W``:``忽略 <cmd> 命令。找不到部分 <objname>(<secname>)。

例如,在构建 Linux 应用程序时,您可能有:

复制代码
`--keep *(.init_array)
`

在生成文件中的链接器命令行上,但在不使用 C++ 进行构建时,此部分可能不存在,在这种情况下,将报告以下警告:

复制代码
`Ignoring --keep command. Cannot find section *(.init_array)
`

通常可以忽略此警告,或使用 --diag_suppress 6319 禁止显示它。

L6320W``:``忽略 <cmd> 命令。找不到参数"<argname>"。

L6323W``:``在 <objname>(<secname>) 中对 <sym> 进行重定位 #<rel_class>:<rel_number>。存在多个变体。使用 <type> 变体解决歧义

L6324W``:``忽略为加载区域 <regname> 指定的 <attr> 属性。

此属性仅适用于执行区域。如果为 Load 区域指定,则链接器将忽略它。

L6325W``:``忽略区域 <regname> 的 <attr> 属性,该属性使用基址的 +offset 形式。

此属性不适用于使用 +offset 形式的基址的区域。如果为使用 +offset 形式的区域指定,则链接器将忽略它。

使用 +offset 形式的基址的区域从以下任一位置继承 PI、``RELOCOVERLAY 属性:

  • 描述中的上一个区域

  • 如果父加载区域是加载区域中的第一个执行区域,则为父加载区域。

请参阅《armlink 用户指南》中的以下内容:

L6326W``:``忽略非 root 执行区域 <ername> 的 ZEROPAD 属性。

ZEROPAD 仅适用于根执行区域。根区域是其执行地址与其加载地址相同的区域,因此不需要在运行时移动或复制。

请参阅《armlink 用户指南》中的以下内容:

执行区域属性.

L6329W``:``模式<module>(<section>) 仅匹配已删除的未使用部分。

与此模式匹配的所有部分都已从图像中删除,因为它们未使用。有关更多信息,请使用 --info unused

请参阅《armlink 用户指南》中的以下内容:

L6330W``:``未定义符号 <symbol>(引用自 <objname>)。删除了未使用的部分。

这意味着未使用的部分已引用其基本符号和限制符号。有关更多信息,请使用 --info unused

例如,使用散点文件放置具有 RVCT 2.1 或更高版本的代码和数据时,如果散点文件包含链接器生成的表 ZISection$$Table,则链接器会报告此错误。在 RVCT 2.1 中,引入了一种新的区域表格式,该格式不再包含 ZISection$$Table

请参阅《armlink 用户指南》中的以下内容:

L6331W``:``没有符合条件的全局符号与模式匹配<pat>。

L6332W``:``未定义符号 <sym1>(引用自 <obj1>)。解析为符号 <sym2>。

L6334W``:``区域 <regname> 的过度对齐<过度对齐>不能为负数。

请参阅《armlink 用户指南》中的以下内容:

执行区域和输入部分的过度对齐.

L6335W``:``<objname>(<secname>) 中的 ARM 互通代码可能包含对 ARM 非互通代码的无效尾部调用。

编译器能够执行尾调用优化,以改进代码大小和性能。但是,ARMv4T 代码存在一个有问题的序列,其中 Thumb 互通 (IW) 函数调用 (单板) ARM IW 函数,该函数尾部调用 ARM 非互通 (~IW) 函数。ARM 非 IW 函数的返回可以将返回地址从堆栈弹出到 PC 中,而不是使用正确的 BX 指令。链接器可以检测到这种情况并报告此警告。

不会发生对 Thumb 非 IW 的 Thumb IW 尾部调用,因为带有 B 的 Thumb 尾部调用的范围太短,以至于它们只能生成到同一 ELF 部分中的函数,该部分也必须是 Thumb。

该警告是悲观的,因为对象可能包含无效的尾调用,但链接器无法确定,因为它只查看对象的属性,而不查看其部分的内容。

为避免出现警告,请使用 --apcs /interwork 重新编译整个代码库(包括任何用户库),或者手动检查 ARM IW 函数以检查尾调用(即,使用普通分支 B 指令进行函数调用的地方),以检查这是否是真正的问题。可以使用 --diag_suppress L6335W 禁止此警告。

L6337W``:``常用代码段<o1>(<s1>)和<o2>(<s2>)具有不兼容的浮点联动

L6339W``:``忽略执行区域<er_name>的 RELOC 属性。

不能显式地为执行区域指定 RELOC 属性。如果使用 +offset 寻址形式,则它们只能通过从父加载区域或以前的执行区域继承此属性来获取此属性。

请参阅《armlink 用户指南》中的以下内容:

执行区域属性.

L6340W``:``对于链接类型 <linktype> 忽略选项 first 和 last。

--first 和 --last 选项在创建部分链接的对象时毫无意义。

L6366E``:``<object> attributes<attr> 与提供的 cpu 和 fpu 属性不兼容<cli> <diff>。

L6367E``:``<object>(<section>) 属性<attr>与提供的 cpu 和 fpu 属性不兼容<cli> <diff>

在 <object>(<section>) 属性<attr>中定义的 L6368E:><symbol 与提供的 cpu 和 fpu 属性不兼容<cli> <diff>

<object>(ABSOLUTE) 中定义的 L6369E:<symbol> 与提供的 cpu 和 fpu 属性不兼容<cli> <diff>

L6370E``:``cpu <cpu> 与 fpu <fpu> 不兼容

请参阅《armlink 用户指南》中的以下内容:

L6371E``:``从 cpu 和 fpu 添加属性:<attrs>

L6372E``:``图像至少需要一个加载区域。

L6373E``:``在系统库目录 <dir> 中找不到 libattrs.map 文件。文库选择可能会受到影响。

L6384E``:``名称为 <region> 的无负载执行区域,尚未在第 <行> 处看到。

这可能是因为您在散点文件的极限计算中使用了当前基址。例如:

复制代码
`ER_foo 0 ImageBase(ER_foo)
`

L6385W``:``在线加法溢流<line>

L6386E``:``Exec 区域表达式只能用于行<行的基址计算>

L6387E``:``荷载区域表达式只能用于行<行的 ScatterAssert 表达式>

请参阅《armlink 用户指南》中的以下内容:

ScatterAssert 函数和加载地址相关函数.

L6388E``:``ScatterAssert 表达式 <expr> 在行 <行> 上失败

请参阅《armlink 用户指南》中的以下内容:

ScatterAssert 函数和加载地址相关函数.

L6389E``:``在线<行>上的加载区域<名称>尚未完成,无法使用依赖于区域长度的操作

L6390E``:``条件运算符 (expr) ?(expr) : (expr) 在行 <line> 上没有 : (expr)。

请参阅《armlink 用户指南》中的以下内容:

L6404W``:``对于执行区域 <name>,FILL 值优先于 EMPTY、ZEROPAD 和 PADVALUE 的组合。

请参阅《armlink 用户指南》中的以下内容:

执行区域属性.

L6405W``:``否 .ANY 选择器匹配第 <name>(<objname>) 节。

请参阅《armlink 用户指南》中的以下内容:

使用 .ANY 模块选择器.

L6406W``:``带有 的执行区域中没有空格。与 Section <name>(<objname>) 匹配的任何选择器。

如果包含 的散点文件区域中没有足够的空间,则会出现这种情况。ANY 放置列出的部分。您必须修改散点文件,以确保有足够的空间用于该部分。

请参阅《armlink 用户指南》中的以下内容:

使用 .ANY 模块选择器.

L6407W``:``聚合大小为 0x<size> 字节的部分无法放入 。任何选择器。

此警告标识不能放置在任何 .任何选择器。

例如,.ANY(+ZI) 放置在对于 ZI 数据量来说太小的执行区域中:

复制代码
`ROM_LOAD 0x8000
{
    ROM_EXEC 0x8000
    {
        .ANY(+RO,+RW)
    }
    RAM +0 0x{...} <<< region max length is too small
    {
        .ANY(+ZI)
    }
}
`

请参阅《armlink 用户指南》中的以下内容:

使用 .ANY 模块选择器.

L6408W``:``输出为 --fpic,但 <obj> 中的第 <sec> 节没有 FPIC 属性。

L6409W``:``输出为 --fpic,但对象 <obj> 没有 FPIC 属性。

L6410W``:``具有非STV_DEFAULT可见性 <vis> 的符号<sym>应静态解析,不能使用 <lib> 中的定义。

L6411W``:``不存在具有启动符号 <name> 定义的兼容库。

L6412W``:``禁用从对象 <obj> 中合并第 <sec> 节,从对象 <srcobj> 中<srcsec非R_ARM_ABS32重新定位>

L6413W``:``禁用从对象 <obj> 中合并第 < 秒>节,节包含未对齐的字符串。

L6414E``:--ropi 不使用 --rwpi 或 --rw-base。

请参阅《armlink 用户指南》中的以下内容:

L6415E``:``找不到与此映像兼容的唯一库集。建议使用 --cpu 选项来选择特定的库。

请参阅《armlink 用户指南》中的以下内容:

--cpu=名称.

L6416E``:``<relclass>:<idx> <objname>(<secname>) 处的重定位<类型>无法贴面,因为它与目标有偏移量<偏移量>。

L6417W``:``<objname>(<secname>) 中的重定位 #<rel_class>:<rel_number> 与保留标记符号 (#<idx>) 有关。

L6418W``:``无法识别 <objname>(<secname>) 中定义的标记符号 <symname>。

L6419W``:``未定义符号 <symbol> (引用自 <objname>) 导入。

L6420E``:``忽略 <oepname>(<secname>:<secnum>),因为它不是可识别的类型。

L6422U``:``PLT 生成需要支持 ARM 指令的架构。

要使链接器生成过程链接表 (PLT),必须使用支持 ARM 指令集的目标。例如,链接器无法为 Cortex-M3 目标生成 PLT。

L6423E``:``在同一集合中,节 <secname> 不能具有不同的排序属性。

L6424E``:``在同一集合中,节 <secname1> 和节 <secname2> 不能分隔为不同的执行区域。

L6425E``:``在同一集合中,节 <secname> 的节名称不能具有不同的长度。

L6426E``:``Within the same collection, section <secname> cannot have its name duplicated.

L6427E``:``Cannot rename <sym> to <newname> as it has already been renamed to <name>).

L6429U``:``Attempt to set maximum number of open files to <val> failed with error code <error>.

An attempt to increase the number of file handles armlink can keep open at any one time has failed.

L6431W``:``Ignoring incompatible enum size attribute on Symbol <symbol> defined in <object>(<section>).

L6432W``:``忽略对象 <object>(<section>) 上不兼容的枚举大小属性。

L6433W``:``忽略对象 <object> 上不兼容的枚举大小属性。

L6434W``:``忽略 <object>(<section>) 中定义的符号<符号>上不兼容的 wchar_t 大小属性。

L6435W``:``忽略部分 <object>(<section>) 上不兼容的 wchar_t size 属性。

L6436W``:``忽略对象 <object> 上不兼容的 wchar_t size 属性。

L6437W``:<objname>(<secname>) 中针对 <armsym> 重新定位 #<rel_class>:<idx>。分支重新定位到对象 <armobjname> 中的非类型化 symol,目标状态未知。

L6438E``:``__AT 节 <objname>(<secname>) 地址 <address> 必须至少 4 字节对齐。

L6439W``:``在 <objname>(<secname>) 中定义的乘法定义的全局符号 <sym> 被拒绝,取而代之的是 <selobj>(<selsec>) 中定义的符号。

L6440E``:``链路时代码生成意外失败

L6441U``:``系统调用获取最大打开文件数失败<错误>。

L6442U``:``Linker 至少需要 <min> 个打开文件,当前系统限制为 <max> 个文件。

L6443W``:``区域<区域>的数据压缩已关闭。区域包含对符号 <symname> 的引用,该符号依赖于压缩地址。

链接器要求在压缩区域之前修复区域的内容,并且在压缩后无法对其进行修改。因此,可压缩区域不能引用依赖于压缩过程的内存位置。

L6444I符号可见性:<symname>设置为<visibility>。

L6445I符号可见性:<symname>已合并到现有<old_vis>和新<new_vis>的<set_vis>。

L6447E``:``SHT_PREINIT_ARRAY 部分不允许在共享对象中使用。

L6448W``:``处理<文件名>时:<消息>

L6449E``:``While processing <filename>: <message>

L6450U``:``Cannot find library <libname>.

L6451E``:``<object> built permitting Thumb is forbidden in an ARM-only link.

L6452E``:``<object>(<section>) built permitting Thumb is forbidden in an ARM-only link.

L6453E``:``<symbol> defined in <object>(<section>) built permitting Thumb is forbidden in an ARM-only link.

L6454E``:``<symbol> defined in <object>(ABSOLUTE) built permitting Thumb is forbidden in an ARM-only link.

L6455E``:``Symbol <symbolname> has deprecated ARM/Thumb Synonym definitions (by <object1> and <object2>).

L6459U``:``Could not create temporary file.

L6462E``:``Reference to <sym> from a shared library only matches a definition with Hidden or Protected Visibility in Object <obj>.

L6463U``:``Input Objects contain <archtype> instructions but could not find valid target for <archtype> architecture based on object attributes. Suggest using --cpu option to select a specific cpu.

See the following in the armlink User Guide:

--cpu=name.

L6464E``:``Only one of --dynamic_debug, --emit-relocs and --emit-debug-overlay-relocs can be selected.

See the following in the armlink User Guide:

L6467W库报告备注:<msg>

L6468U``:--base_platform 仅支持 --pltgot=direct 或 --pltgot=none,具有多个包含代码的加载区域。

请参阅《armlink 用户指南》中的以下内容:

L6469E``:``--base_platform 不支持包含非 RELOC 执行区域的 RELOC 加载区域。请在加载区域 <lrname> 中使用 +0 作为执行区域 <ername> 的基址。

请参阅《armlink 用户指南》中的以下内容:

L6470E``:``PLT 部分 <secname> 不能移到加载区域 <lrname> 之外。

L6471E``:``从对象 <objname> 部分 <secname> 中的分支重新定位 <rel_class>:<id>x 是指对象 <armobjname> 中的 ARM 绝对 <armsym> 符号,禁止显示错误以将其视为 Thumb 地址。

L6475W``:``未指定 --override_visibility 时忽略 IMPORT/EXPORT 命令

由于可见性低,您尝试导出的符号(使用转向文件中的 EXPORT 命令或使用 --undefined_and_export 命令行选项)不会导出。

请参阅《armlink 用户指南》中的以下内容:

L6616E``:``无法从 <obj_name> 增加 RegionTable <sec_name> 的大小

L6617E``:``无法从 <obj_name> 增加 ZISectionTable <sec_name>的大小

L6629E``:``预期括号不匹配),但在第 <行> 的位置 <col> 处找到<字符>

此消息表示分散文件中存在解析错误。

L6630E``:``无效的标记开始预期编号或(但发现<字符>位于第 <行> 的 <col> 位置

此消息表示分散文件中存在解析错误。

L6631E``:``除以零在线<线>

此消息表示散点文件中存在表达式计算错误。

L6632W``:``在线<线上减法下溢>

此消息表示散点文件中存在表达式计算错误。

L6634E``:"``<文件名>中的预处理器命令太长,最大长度为 <max_size>

此消息表示预处理散点文件时出现问题。

L6635E``:``无法打开预处理器生成的中间文件"<文件名>:"原因<>

此消息表示预处理散点文件时出现问题。

L6636E``:"``<文件名>的预处理器步骤失败

此消息表示预处理散点文件时出现问题。

L6637W``:``未指定输入对象。必须至少指定一个输入对象或库(对象)。

必须至少指定一个输入对象或库(对象)。

L6638U``:``Object <objname> 具有链接顺序依赖循环,请检查带有SHF_LINK_ORDER的部分

L6640E``:``PDTTable 部分不最少静态数据地址,最少静态数据部分为 <secname>

使用 RWPI 实现共享库的系统使用过程数据表 (PDT)。它由链接器在静态链接时创建,必须首先放置在图像的数据区域中。

此消息表示散点文件不允许将 PDT 首先放置在图像的数据区域中。

为避免出现此消息,请调整分散文件,以便正确放置 PDT。如果您不小心使用 --apcs=/rwpi 构建对象文件,也会触发此消息。

L6642W``:``未使用的虚函数消除可能无法正常工作,因为<obj_name>尚未使用 --vfe 进行编译

L6643E``:``<sectionname> 中的虚函数消除信息引用了错误的部分。

此消息可能表示编译器错误。请联系您的供应商。

L6644E``:``读取 <oepname>(<sectionname>) 中的虚函数消除信息时,意外到达缓冲区末尾。

此消息可能表示编译器错误。请联系您的供应商。

L6645E``:``<oepname>(<sectionname>) 中的虚函数消除信息不正确:应在偏移量 <offset>处进行重新定位。

此消息可能表示编译器错误。请联系您的供应商。

L6646W``:``第 <oepname>(<sectionname>) 节中的虚函数消除信息包含偏移量 <offset> 以后的垃圾。

此消息可能表示编译器错误。请联系您的供应商。

L6647E``:``<vcall_objectname>(<vcall_sectionname>) 的虚函数消除信息错误地指示第 <curr_sectionname>(对象<curr_objectname>)部分偏移<偏移>是重定位(到虚功能或 RTTI),但在该偏移处没有重定位。

此消息可能表示编译器错误。请联系您的供应商。

L6649E``:``EMPTY 区域 <regname> 必须具有最大大小。

请参阅《armlink 用户指南》中的以下内容:

执行区域属性.

L6650E``:``对象 <objname> 组部分 <sectionidx> 包含无效的符号索引 <symidx>。

L6651E``:``对象 <objname> 中的部分 <secname> 具有SHF_GROUP标志,但不是任何组的成员。

L6652E``:``无法反转数据段的字节顺序,输入对象为<inputendian>请求的数据字节顺序为<dataendian>。

L6654E``:``拒绝从非组成员 <objname>(<nongrpname>) 引用的本地符号 <symname>

此消息可能表示编译器错误。请联系您的供应商。

L6656E内部错误:vfe 部分列表包含一个名为 <oepname>(<secname>) 的非 vfe 部分。

此消息可能表示编译器错误。请联系您的供应商。

L6664W``:``<objname>(<secname>) 中的重定位 #<rel_class>:<rel_number> 与最后一个地图符号 #<last> 之前的符号 (#<idx> 有关。

L6665W``:``既未定义 Lib$$Request$$armlib Lib$$Request$$cpplib,也不搜索 ARM 库。

以下代码生成此警告:

复制代码
`  AREA Block, CODE, READONLY
  EXPORT func1
  ;IMPORT ||Lib$$Request$$armlib||
  IMPORT printf
func1
  LDR r0,=string
  BL printf
  BX lr
  AREA BlockData, DATA
string DCB "mystring"
  END
`

链接器未被告知要在库中查找,因此找不到符号 printf

这也会导致以下错误:

复制代码
`L6218E: Undefined symbol printf (referred from L6665W.o).
`

如果您不需要这些库,请忽略此消息。否则,要修复错误和警告,请取消注释该行:

复制代码
`IMPORT ||Lib$$Request$$armlib||
`

L6679W``:``输出 ELF 部分 #<sec> '<secname>' 中的数据不适合压缩(<data_size> 字节到 <compressed_size> 字节)。

L6682E``:``合并节 <oepname>(<spname>) 是一个代码节

L6683E``:``Merge 部分 <oepname>(<spname>) 的元素大小为零

L6684E``:``对象 <oepname> 中的部分 <spname> 具有SHF_STRINGS标志,但没有SHF_MERGE标志

L6685E``:``对象 <oepname> 中的第 <spname> 部分具有<rel_idx>到SHF_MERGE部分的分支 reloc

L6688U``:``<oepname>(<spname>) 中的重定位 #<rel_idx><rel_class>: 引用了否定元素

L6689U``:``在 <oepname>(<spname>) 中重新定位 #<rel_class>:<rel_idx>。目标位于多字节字符的中间

L6690U``:``从对象 <oepname> 合并部分 <spname> 没有符号

L6703W``:``第 <er> 节隐式标记为不可压缩。

L6707E``:``未使用执行区域 <regionname> 的 PADVALUE 属性指定填充值。

请参阅《armlink 用户指南》中的以下内容:

执行区域属性.

L6708E``:``无法处理来自对象 <oepname> 的 <secname> 的调试帧。

L6709E``:``无法将 fde 与对象 <oepname> <secname>关联。

L6713W``:``<oepname>(<secname>) 中偏移<偏移>处的函数没有符号。

L6714W``:``异常索引表部分。对象 <oepname> 中的 ARM.exidx 没有数据。

L6720U``:``异常表 <spname> 来自图像中存在的对象 <oepname>,指定了 --noexceptions。

请参阅《armlink 用户指南》中的以下内容:

--例外、--no_exceptions.

L6721E``:``<oepname>>中的第 #<secnum 节"<secname>"无法识别,无法进行一般处理。

L6725W``:``未使用的虚功能消除可能无法正常工作,因为存在动态重定位。

L6728U``:``链接顺序依赖于无效的节号 <to> from 节号 <from>。

L6730W``:``在 <objname>(<secname>) 中相对于 <name> 重新定位 #<rel_class>:<index>。符号具有 ABI 类型 <type>,legacy 类型为 <legacy_type>。

此警告与 RVCT 2.0 和 2.1 之间的链接器行为更改有关。

注意

仅当使用 --strict_relocations 或输入对象来自 RVCT 2.0 或更早版本时,以下示例才会生成警告消息。

例:

复制代码
`    AREA foo, CODE, READONLY
    CODE32
    ENTRY
    KEEP
func proc
    NOP
    ENDP
    DCD foo
    END
`

在 RVCT 2.0 及更早版本中,链接器根据内容(在此示例中为 ARM 代码)确定是否需要互通。在 RVCT 2.1 及更高版本中,链接器遵循 ABI,该 ABI 定义它是符号的类型,在本例中为 STT_SECTION(解释为数据),用于确定是否应用互通。

最简单的解决方案是将数据移动到程序集源文件中的单独数据区域。

或者,您可以使用 --diag_suppress 6730 来禁止显示此警告。

L6731W``:``未使用的虚函数消除可能无法正常工作,因为从 <secname> 引用的部分不存在。

L6733W``:``<objname>(<secname>) 包含从 <lr1name> 到 <lr2name> 的偏移重定位,荷载区域必须是刚性相对的。

L6738E``:``在 <oepname>(<secname>) 中,相对于 <wrtsym> 的重定位 #<rel_class>:<relocnum> 是 GGOT 相对重定位,但_GLOBAL_OFFSET_TABLE_未定义。

一些 GNU 生成的图像可以引用名为 _GLOBAL_OFFSET_TABLE_ 的符号。如果没有生成重定位的 GOT ,并且链接器无法为 GOT 基选择合适的地址,则链接器会发出此错误消息。

L6739E``:``版本"<vername>"依赖于未定义的版本"<depname>"。

L6740W``:``符号"<symname>"版本为"<vername>",在<"symverscr>"中定义,但未在任何输入对象中找到。

L6741E``:``版本控制符号绑定应为"local:"或"global:"。

L6742E``:``符号"<symname>由"<oepname>"定义。不能与默认版本符号"<defversym>"不匹配

L6743E``:``在 <oepname>(<spname>) 中,对于具有备用定义的 <symname>,重新定位 #<rel_class>:<index>。 内部一致性检查失败

L6744E``:``重新定位 #<rel_class>:<index> <oepname>(<spname>) 与未定义的符号 <symname>。内部一致性检查:

L6745E``:``目标CPU<cpuname>不支持ARM,<objname>(<secname>)包含ARM代码

L6747W``:``将目标架构从<oldversion>提升为<newversion>。

如果链接器检测到指定过时的 ARMv3 的对象,它会将这些对象升级到 ARMv4,以便可用于 ARM 库。

L6748U``:``文件中缺少动态数组、符号表或字符串表<oepname>。

L6751E``:``没有这样的排序算法<str>可用。

L6753E``:``CallTree 排序需要入口点位于 CallTree 排序 ER 中。

L6761E``:``删除符号<符号名>。

L6762E``:构建 <imgtype> 时无法构建"<type>"PLT 条目。

L6763W``:``生成共享对象或 DLL 时不能使用"<optname>"。将其关闭

L6764E``:``无法为调用拇指符号 <symname> 的目标体系结构 4T 创建 PLT 条目

L6765W``:``链接架构 4T 对象时,共享对象入口点必须为 ARM 状态。

当与 GNU C 库链接时,可能会发生这种情况。GNU 启动代码 crt1.o 没有任何入口点的生成属性,因此链接器无法确定代码在哪种执行状态(ARM 或 Thumb)下运行。由于 GNU C 库启动代码是 ARM 代码,因此可以安全地忽略此警告,也可以使用 --diag_suppress 6765 禁止显示此警告。

L6766W``:``PLT entries for architecture 4T do not support incremental linking.

L6769E``:``Relocation #<rel_class>:<relocnum> in <oepname>(<secname>) with respect to <wrtsym>. No GOTSLOTexists for symbol.

L6770E``:``The size and content of the dynamic array changed too late to be fixed.

L6771W``:``<oepname>(<secname>) contains one or more address-type relocations in RO data. Making section RW to be dynamically relocated at run-time.

L6772W``:``IMPORT <symname> command ignored when building --sysv.

请参阅《armlink 用户指南》中的以下内容:

L6774W``:``<objname>(<secname>) 的调试帧条目长度不正确。

L6775W``:``<objname>(<secname>) 具有使用本节中未包含的 CIE 的 FDE。

L6776W``:``<objname>(<secname>) 中的调试帧不描述可执行部分。

L6777W``:``<objname>(<secname>) 中的调试帧具有<实际>重定位(预期<预期>)

L6778W``:``<objname>(<secname>) 中的调试帧使用 64 位 DWARF。

L6780W``:``<origvis>可见性从符号"<symname> 到 <impexp> 中删除。

L6781E``:Value(<val>) 不能由分区号 <part> 表示,用于重新定位 #<rel_class>:<rel_number> (<rtype>, wrt 符号 <symname>) in <objname>(<secname>)

L6782W``:``重新定位 #<rel_class>:<relnum> <oepname> 中的 '<rtype>' 可能无法正确访问数据以及<pltgot_type> PLT 条目

L6783E``:``映射符号 #<symnum> '<msym>' in <oepname>(<secnum>:<secname>) 定义在截面大小(符号偏移量=0x<moffset>,截面大小=0x<moffset>,截面大小=0x<secsize>)的末尾或之后

这表示某个部分的地址指向 ELF 部分末尾或外部的位置。这可能是由空的内联数据部分引起的,并指示对象文件可能存在问题。您可以使用 --diag_warning 6783 来抑制此错误。

L6784E``:``符号 #<symnum> <oepname>(<secnum>:<secname>) 中的 '<symname>',值为 <value>,大小为 0x<size>,延伸到该部分的外部。

链接器遇到一个符号,其大小超出了其包含部分。默认情况下,此消息只是 RVCT 2.2 build 503 及更高版本工具链中的警告。使用 --diag_warning 6784 禁止显示此错误。

L6785U``:``符号"<symname>标记为从"<libname>导入,已由"<oepname>"定义

L6786W``:``映射符号 #<symnum> '<msym>' in <oepname>(<secnum>:<secname>) 定义在未对齐的偏移量=0x<moffset>

L6787U``:``找不到 <regionname> 的条目所需的区域表处理程序"<handlername>。

L6788E``:``将执行区域 <er1name> 分散加载到 [<base1>,<limit1>) 将导致执行区域 <er2name> 位于 [<base2>,<limit2>) 的内容在运行时损坏。

当发生分散加载并且执行区域处于部分或全部覆盖另一个执行区域(可以是自身或另一个区域)的位置时,就会发生这种情况。

例如,以下代码生成此错误:

复制代码
`LOAD_ROM 0x0000 0x4000
{
 EXEC1 0x4000 0x4000
 {
 * (+RW,+ZI)
 }
 EXEC2 0x0000 0x4000
 {
 * (+RO)
 }
}`

并报告:

复制代码
`Error: L6788E: Scatter-loading of execution region EXEC2 will cause the contents of execution region EXEC2 to be corrupted at run-time.
`

此代码不会生成错误:

复制代码
`LOAD_ROM 0x0000 0x4000
{
 EXEC1 0x0000 0x4000
 {
 * (+RO)
 }
 EXEC2 0x4000 0x4000
 {
 * (+RW,+ZI)
 }
}
`

请参阅《armlink 用户指南》中的以下内容:

有关 scatter 文件的信息.

L6789U``:``Library <library> 成员<文件名>:字节序不匹配。

L6790E``:<objname>(<secname>) 中对 <symname> 进行重新定位 #<rel_class>:<relnum>。可能无法通过 GIT 生成重定位导入弱引用

L6791E``:``未知人格例程 <pr> at 0x<offset> <oepname>(<secname>)。

L6792E``:``偏移量为 0x<offset> <oepname>(<secname>)处的描述符。

L6793E``:``在清理描述符 <oepname>(<secname>>) 中,期望在偏移量 0x<offset 处获得着陆板参考(secname)。

L6794E``:``在 catch 描述符 <oepname(<secname>) 中,期望在偏移量 0x<偏移处>处获得着陆板参考>(secname)。

L6795E``:``在 catch 描述符 <oepname>(<secname>) 中,期望偏移量为 0x<offset 处的 RTTI 引用>。

L6796E``:``偏移量 0x<offset> <oepname>(<secname>) 处的描述符超出部分末尾。

L6797E``:``异常表 <oepname>(<secname>) 中偏移量 0x<偏>移量处的数据超出部分末尾

L6798E``:``在功能规范描述符 <oepname>(<secname>) 中,期望在偏移量 0x<偏移>处获得 RTTI 参考。

L6799E``:``在功能规范描述符 <oepname>(<secname>) 中,期望在偏移量 0x<偏移处>着陆板参考。

登陆板是在引发异常后清理的代码。如果链接器检测到旧格式的异常表,它会自动将其转换为新格式。

除非将更高版本的链接器与早期版本的编译器一起使用,否则不会显示此消息。

L6800W``:``无法在 0x<offset> <oepname>(<secname>) 处转换通用模型个性例程。

个性例程展开异常处理堆栈。如果链接器检测到旧格式的异常表,则会自动将其转换为新格式。此消息表示编译器中存在错误。请联系您的供应商。

L6801E``:``<objname>(<secname>) 包含 <secarmthumb> 代码不能使用"~IW(用户预期并非所有代码都应互通)"<funarmthumb> 函数 <sym> 的地址。

链接器可以诊断非互通 (~IW) 函数的地址在何处被处于其他状态的代码所采用。默认情况下,此错误处于禁用状态,但可以通过使用 --strict 链接来启用。可以使用 --diag_warning 6801 将错误降级为警告,然后根据需要使用 --diag_suppress 6801 完全禁止该错误

例如,a.c 中的代码使用 t.c 中非互通函数的地址:

复制代码
`armcc -c a.c
armcc --thumb -c t.c
armlink t.o a.o --strict
`

报告:

复制代码
`Error: L6801E: a.o(.text) containing ARM code cannot use the address of '~IW' Thumb function foo.
`

L6802E``:<objname>(<secname>) 中对 <armsym> 进行重定位 #<rel_class>:<idx>。拇指分支为 <armobjname>(<armsecname>) 中的非拇指符号。

L6803W``:<objname>(<secname>) 中对 <armsym> 进行重定位 #<rel_class>:<id>x。Thumb Branch 不太可能到达目标 in<armobjname>(<armsym>)。

L6804W``:``检测到符号类型STT_TFUNC旧版

L6805E``:<objname>(<secname>) 中相对于 <armsym> 重新定位 #<rel_class>:<idx>。分支到 <armobjname> 中的无类型绝对符号,目标状态未知

L6806W``:<objname>(<secname>) 中对 <othersym> 进行重定位 #<rel_class>:<idx>。分支到 <otherobjname>(<othersecname>) 中的非类型符号,ABI 要求外部代码符号的类型为 STT_FUNC。

L6807E``:<objname>(<secname>) 中对 <othersym> 进行重定位 #<rel_class>:<idx>。分支到同一部分中的非类型符号。需要更改状态。

L6809W``:``<objname>(<secname>>) 中的重定位 <rel_class>:<idx 属于不推荐使用的类型 <rtype>,请参阅 ARMELF 以获取符合 ABI 的替代方案

L6810E``:``<objname>(<secname>) 中的重定位 <rel_class>:<id>x 已过时类型 <rtype>

如果链接使用早期版本的 ARM 工具生成的对象文件,则最有可能发生重定位错误和警告。

若要显示重定位错误和警告,请使用 --strict_relocations 开关。此选项使您能够确保对象的 ABI 合规性。默认情况下,它处于关闭状态,并且链接器以静默方式处理已弃用和过时的重定位。

请参阅《armlink 用户指南》中的以下内容:

--strict_relocations, --no_strict_relocations.

L6812U``:``未知符号动作类型,请联系您的供应商。

L6813U``:``找不到要重命名为 <newname> 的符号<symname>。

请参阅《armlink 用户指南》中的以下内容:

RENAME 转向文件命令.

L6815U``:``内存不足。分配规模:<alloc_size> 系统规模:<system_size>。

ARM 编译器 v4.1 及更高版本报告此错误。它提供有关可用内存量和执行链接步骤所需的内存量的信息。

发生此错误的原因是链接器没有足够的内存来链接目标对象。这并不常见,但可能由于多种原因而触发,例如:

  • 将非常大的对象或库链接在一起。

  • 生成大量调试信息。

  • 在散点文件中定义了非常大的区域。

在这些情况下,您的工作站可能会耗尽虚拟内存。

如果使用 FIXED 散点加载属性,也可能会出现此问题。FIXED 属性强制执行区域成为 ROM 中固定地址的根区域。链接器可能必须在上一个执行区域的末尾和 FIXED 区域之间添加填充字节,以生成 ROM 映像。如果在 FIXED 区域的地址远离执行区域的末尾时添加大量填充,则链接器可能会耗尽内存。如果间隙减小,链接步骤可能会成功。

请参阅《armlink 用户指南》中的以下内容:

虽然链接器可以生成几乎任何大小的图像,但它需要更多的内存来运行和完成链接。请尝试以下解决方案来提高链接时间性能,以避免内存不足错误:

  1. 链接时关闭所有不必要的应用程序和进程。

    例如,如果您在 Eclipse 下运行,请尝试从命令行运行链接器,或者在构建之间退出并重新启动 Eclipse。

  2. 使用 64 位版本的链接器。

    如果您使用的是 64 位操作系统,则可以使用 64 位版本的 armlink。

    请参阅《入门指南》中的以下内容:

    更改为 64 位链接器.

  3. 使用 --no_debug 链接器选项。

    此命令指示链接器在不包含任何调试信息的情况下创建对象。

    请参阅《armlink 用户指南》中的以下内容:

    --debug、--no_debug.

    注意

    如果使用此选项,则无法执行源代码级调试。

  4. 减少调试信息。

    如果不想使用 --no_debug 选项,可以使用其他方法来尝试减少调试信息。

    请参阅《armcc 用户指南》中的以下内容:

    减少对象和库中调试信息的方法.

    您还可以使用 fromelf 实用程序从不必调试的对象和库中剥离调试信息。

    请参阅《fromelf 用户指南》中的以下内容:

    --strip=选项[,选项,...].

  5. 使用部分链接。

    您可以使用部分链接将链接阶段拆分为几个较小的操作。这样做还会阻止在最终链接中复制内存中的目标文件。

    请参阅《armlink 用户指南》中的以下内容:

    --部分.

  6. 增加对 Windows 操作系统的内存支持。

    在某些 Windows 操作系统上,可以将虚拟地址空间从 2GB(默认值)增加到 3GB。

    有关详细信息,请参阅以下 Microsoft 文章:

    内存支持和 Windows 操作系统.

  7. 使用 --no_eager_load_debug 链接器选项。

    此选项在 RVCT 4.0 build 697 及更高版本中可用。它会导致链接器在对象加载后从内存中删除调试部分数据。这样会降低链接器的峰值内存使用率,但会牺牲一些链接器性能,因为在写入最终映像时,必须再次加载大部分调试数据。

    请参阅《armlink 用户指南》中的以下内容:

    --eager_load_debug、--no_eager_load_debug.

如果您仍然遇到同样的问题,请提出支持案例。

L6828E``><<rel_class>:在 <objname>(<secname>) 中,相对于 <symname>,分支源地址 <srcaddr> 无法到达位于 [<pool_base>,<pool_limit>] 的下一个可用池。请使用 --veneer_pool_size 选项来增加意外事件。

--veneer_inject_type=池单板生成模型要求池中单板的分支能够达到池限制,这是单板可以使用的最高地址。如果后来发现某个分支无法达到池限制,并且 armlink 能够将池中的所有单板放入池的下限,则 armlink 会降低池限制以容纳该分支。仅当 armlink 无法降低池限制时,才会发出错误消息 L6828。

请参阅《armlink 用户指南》中的以下内容:

--veneer_inject_type=类型.

L6898E``:<objname>(<secname>) 中针对 <armsym> 重新定位 #<rel_class>:<id>x。ARM 分支为 <armobjname>(<armsecname>) 中的非 ARM/Thumb 符号。

L6899E``:``现有 SYMDEFS 文件"<文件名>"是只读的。

L6900E``:``预期括号指定 AND 和 OR 运算符之间的优先级。

L6901E``:``预期的符号名称。

L6902E``:``需要字符串。

L6903E``:``无法在脚本的"<子句>子句中执行"<text>"。

L6904E``:重命名操作的目标符号与另一个重命名冲突。

L6905E``:重命名操作的源符号与另一个重命名冲突。

L6906E``:``(这是与之冲突的重命名操作。

L6907E``:``需要表达式。

L6910E``:``需要阶段名称。

L6912W``:``在 <oepname>(<secname>) 中的索引 <idx> 处定义的符号<符号>具有 ABI 符号类型 <symtype>,这与映射符号类型 <maptype> 不一致。

L6913E``:``预期的执行区域名称。

L6914W``:``使用 --<memoption> 时忽略选项<虚假>。

L6915E库报告错误:<msg>

该消息通常是以下消息之一:

复制代码
`Error: L6915E: Library reports error: scatter-load file declares no heap or stack regions and __user_initial_stackheap is not defined.
`

复制代码
`Error: L6915E: Library reports error: The semihosting __user_initial_stackheap cannot reliably set up a usable heap region if scatter loading is in use
`

很可能您没有重新实现 __user_setup_stackheap(),或者您没有在相应的散点文件中定义ARM_LIB_STACKARM_LIB_HEAP区域。

注意

__user_setup_stackheap() 取代了已弃用的函数 __user_initial_stackheap()。

请参阅《软件开发指南》中的以下内容:

放置堆栈和堆.

请参阅 ARM C 和 C++ 库和浮点支持用户指南中的以下内容:

请参阅《armlink 用户指南》中的以下内容:

保留空白区域.
*

复制代码
`Error: L6915E: Library reports error: __use_no_semihosting was requested but <function> was referenced. 
`

其中 <function> 表示__user_initial_stackheap_sys_exit、_sys_open_sys_tmpnam_ttywrch、系统删除重命名_sys_command_string时间时钟

在重定向半托管使用函数时,可能会出现此错误,以避免从 C 库链接任何 SVCBKPT 指令。

通过使用以下方法,确保没有使用 semihosting-using 函数从 C 库中链接:

复制代码
`#pragma import(__use_no_semihosting)
`

请参阅 ARM C 和 C++ 库和浮点支持用户指南中的以下内容:

在非半托管环境中使用库.

如果仍有使用半托管的函数被链接,则链接器会报告此错误。

若要解决此问题,必须提供这些 C 库函数的自己的实现。

emb_sw_dev 目录包含如何重新实现一些更常见的半托管使用函数的示例。请参阅文件 retarget.c。

有关使用半托管的 C 库函数的详细信息,请参阅以下内容:

ARM C 和 C++ 库和浮点支持用户指南.

注意

链接器不会在您自己的应用程序代码中报告任何使用半宿主的函数,例如 __semihost())。

要确定哪些使用半托管的函数仍在从 C 库中链接,请执行以下操作:

  1. 与 armlink 链接 --verbose --list err.txt

  2. 搜索错误.txt以查找出现__I$use$semihosting

    例如:

    复制代码
    `...
    Loading member sys_exit.o from c_2.l.
    reference : __I$use$semihosting
    definition: _sys_exit
    ...`

    这表明半托管使用函数_sys_exit是从 C 库链接的。若要防止出现这种情况,必须提供此函数的实现。

复制代码
`Error: L6915E: Library reports error:__use_no_heap was requested, but <reason> was referenced
`

如果 <reason> 表示 mallocfree__heapstats__heapvalid,则 __use_no_heap 的使用与这些函数冲突。
*

复制代码
`Error: L6915E: Library reports error:__use_no_heap_region was requested, but <reason> was referenced
`

如果 <reason> 表示 mallocfree__heapstats__heapvalid__argv_alloc,则 __use_no_heap_region 的使用与这些函数冲突。

L6916E``:``在 <oepname>(<spname>) 中重新定位 #<rel_class>:<idx>。R_ARM_CALL条件提单指示)。

L6917E``:``在 <oepname>(<spname>) 中重新定位 #<rel_class>:<idx>。R_ARM_JUMP24 BLX 指令。

L6918W``:``执行区域 <ername>位于 0x<eraddr> 需要填充以确保 <oepname>(<spname>) 的对齐 <spalign>。

L6922E``:``Section <objname>(<secname>) 具有互斥属性(READONLY 和 TLS)

L6923E``:<oepname>(<spname>) 中对 <symname> 进行重定位 #<rel_class>:<idx>。TLS 重定位<type> 到 <symobjname>(<symsecname>) 中的非 TLS 符号。

L6924E``:<oepname>(<spname>) 中对 <symname> 进行重定位 #<rel_class>:<idx>。非 TLS 重定位<type>到 <symobjname>(<symsecname>) 中的STT_TLS符号。

L6925E``:``忽略区域 <region> 的 <token> 属性。删除了对 MemAccess 的支持。

L6926E``:``对于指令编码 0x<bl>>,<oepname>(<spname>) 中的重<<rel_class>定位类型 <rtype> 不正确。

L6927E``:``对于指令编码 0x<bl1><>,<oepname>(<spname>) 中的<<rel_class>重定位类型 <rtype>> 不正确。

L6932W库报告警告:<msg>

请参阅《迁移和兼容性指南》中的以下内容:

RVCT v3.1 和 RVCT v4.0 之间的链接器更改.

L6935E``:``调试组内容不相同,<名称>与对象 (<new>) 和 (<old>) 的签名符号 <sig>

L6936E``:``库脚本中符号"<sym>"的多个 RESOLVE 子句。

L6937E``:``库脚本函数"<func>"的多个定义。

L6939E``:``缺少区域 <regname> 的对齐方式。

L6940E``:``区域 <regname> 的对齐<对齐>必须至少为 4,并且幂为 2 或最大值。

L6941W``:``chmod 系统调用失败,出现文件<文件名>错误 <perr>

L6942E``:``执行区域 <ername> 包含多个 <type> 部分:

L6966E``:``区域 <regname> 的对齐<对齐>不能为负数。

L6967E``:``入口点 (<address>) 指向 THUMB 指令,但不是有效的 THUMB 代码指针。

L6968E``:``无法解析 Linux 内核版本 \"<kernel>\"。

L6969W``:``在 <ername> 中将 AT 部分 <name> 类型从 RW 更改为 RO。

L6971E``:``<objname>(<secname>) 类型 <type> 与 er <ername> 中的 <prevobj>(<prevname>) 类型 <prevtype> 不兼容。

使用散点文件放置__at部分时,您可能会看到此消息。例如,main.c 和相关 scatter 文件中的以下代码给出此错误:

int 变量 __attribute__((at(0x200000)));

复制代码
`LR1 0x0000 0x20000
{
    ER1 0x0 0x2000
    {
        *(+RO)
    }
    ER2 0x8000 0x2000
    {
        main.o
    }
    RAM 0x200000 (0x1FF00-0x2000)
    {
        *(+RW, +ZI)
    }
}
`

该变量的类型为 ZI,链接器尝试将其放置在地址 0x200000。但是,此地址由散点文件保留给 RW 部分。这会产生错误:

Error: L6971E: stdio_streams.o(.data) type RW incompatible with main.o(.ARM.__AT_0x00200000) type ZI in er RAM.

若要解决此问题,请更改源代码中的地址,例如:

int 变量 __attribute__((at(0x210000)));

请参阅《armlink 用户指南》中的以下内容:

L6972E``:``<objname>(<secname>) 具有所需的基数 0x<required> 已分配基址 0x<actual>。

L6973E``:AT 部分放置在覆盖 ER <ername> 中的地址 0x<addr> 处时出错。

例如,在生成具有覆盖区域的 DLL 或应用程序时,您尝试使用 __attribute__((at()))address 放置节。__attribute__((at()))address 要求您在散点文件中指定一个固定位置。ARM.__at_地址 。在这种情况下,还必须指定 --no_autoat 链接器选项。

请参阅《armlink 用户指南》中的以下内容:

L6974E``:``AT 部分<名称>没有基址。

请参阅《armlink 用户指南》中的以下内容:

将部分放置在具有__at的特定地址.

L6975E``:``<objname>(<secname>) 不能具有必需的基数和SHF_MERGE。

L6976E``:``<objname>(<secname>) 不能具有必需的基数和SHF_LINK_ORDER。

L6977E``:``<objname>(<secname>) 不能是连续部分块的一部分

L6978W``:``<objname>(<secname>) 具有用户定义的截面类型和所需的基址。

L6979E``:``<objname>(<secname>) 具有所需的基址不能放置在与位置无关的 ER <ername> 中。

L6980W``:``对于具有所需基址的 <objname>(<secname>),忽略 FIRST 和 LAST。

请参阅《armlink 用户指南》中的以下内容:

具有 FIRST 和 LAST 属性的截面放置.

L6981E``:``__AT与 BPABI 和 SystemV 映像类型不兼容

请参阅《armlink 用户指南》中的以下内容:

放置__at部分的限制.

L6982E``:AT 部分 <objname>(<spname>) 与基数 <base> 限制 <limit> 与 AT 节 <obj2name>(<sp2name>) 与基数 <base>2 限制 <limit2> 重叠。

请参阅《armlink 用户指南》中的以下内容:

将部分放置在具有__at的特定地址.

L6983E``:``AT 部分 <objname>(<spname>) 所需的基址 <base>超出 ER <ername>的范围,具有基数 <erbase> 和限制 <erlimit>。

如果在代码中指定 __attribute__((at()))address ,则可能会发生这种情况。ARM.__at_address ,以及链接器命令行上的 --no_autoat 选项。在本例中,地址部分为 。ARM.__at_address 必须指定为八个十六进制数字。例如:

复制代码
`int x1 __attribute__((at(0x4000)));  // defined in function.c
; scatter file
LR1 0x0
{
    ...
        function.o(.ARM.__at_0x00004000)
    ...
}
`

请参阅《armlink 用户指南》中的以下内容:

L6984E``:AT 部分 <objname>(<spname>) 具有必需的基址 <base>,该地址与部分对齐方式 <alignment> 不对齐。

请参阅《armlink 用户指南》中的以下内容:

将部分放置在具有__at的特定地址.

L6985E``:``无法自动将 AT 部分 <objname>(<spname>) 与所需的基址 <base> 放在一起。请使用 --no_autoat 选项手动放入散点文件。

请参阅《armlink 用户指南》中的以下内容:

相关推荐
美式小田3 小时前
单片机学习笔记 9. 8×8LED点阵屏
笔记·单片机·嵌入式硬件·学习
兰_博3 小时前
51单片机-独立按键与数码管联动
单片机·嵌入式硬件·51单片机
时光の尘3 小时前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
嵌入式大圣5 小时前
单片机结合OpenCV
单片机·嵌入式硬件·opencv
日晨难再6 小时前
嵌入式:STM32的启动(Startup)文件解析
stm32·单片机·嵌入式硬件
yufengxinpian7 小时前
集成了高性能ARM Cortex-M0+处理器的一款SimpleLink 2.4 GHz无线模块-RF-BM-2340B1
单片机·嵌入式硬件·音视频·智能硬件
__基本操作__8 小时前
历遍单片机下的IIC设备[ESP--0]
单片机·嵌入式硬件
网易独家音乐人Mike Zhou14 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
zy张起灵14 小时前
48v72v-100v转12v 10A大功率转换电源方案CSM3100SK
经验分享·嵌入式硬件·硬件工程
lantiandianzi21 小时前
基于单片机的多功能跑步机控制系统
单片机·嵌入式硬件