8

我有两个链接器脚本:common.ld它定义了一些符号,以及app.ld使用这些定义来定位这些部分。

如果我只是将这两个文件放在一起,并将其提供给 ld(通过 gcc),它就可以工作。如果我使用INCLUDE命令:

包括 common.ld

我得到错误:

ld.exe:标志中的无效语法

collect2: ld 返回 1 个退出状态

我做错了什么?包含另一个加载脚本的正确语句是什么?


来自http://www.scoberlin.de/content/media/http/informatik/gcc_docs/ld_3.html#IDX204

包括文件名

此时包括链接描述文件文件名。将在当前目录以及使用 -L 选项指定的任何目录中搜索该文件。您可以嵌套调用 INCLUDE 最多 10 层。

注意:我在 Windows 7 PC 上运行它,使用来自 Code Red 的 arm gcc 工具,完整版:

arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 4.6.2 20121016 (release) [ARM/embedded-4_6-branch revision 192487

4

3 回答 3

10

这个很有趣。显然 ld 命令文件词法分析器中有一个错误。我正在使用 binutils 2.24 版并且遇到了同样的问题。您包含的一个文件有一个 MEMORY 命令,例如

MEMORY
{
  rom (rx) : ORIGIN = 0x00000000, LENGTH = 64M
  ram (!rx) : ORIGIN = 0x48000000, LENGTH = 32M
}

我认为(但尚未证明)词法分析器正在为包含文件中的第二个属性返回“!rx”而不是“rx”。将 MEMORY 命令更改为

MEMORY
{
  rom (rx) : ORIGIN = 0x00000000, LENGTH = 64M
  ram (! rx) : ORIGIN = 0x48000000, LENGTH = 32M
}

解决问题。我查看了 ld 源中的 ldlex.l 和 ldgram.y,但在我的眼睛开始受伤之前找不到明显的错误。

错误报告:https ://sourceware.org/bugzilla/show_bug.cgi?id=17900

于 2014-10-09T09:46:36.473 回答
1

包含语法应该是正确的,INCLUDE common.ld在这里可以正常工作。

可能是 Windows 版本的 ld 有错误,或者您的链接器脚本或环境有问题?

于 2014-03-22T09:07:35.010 回答
0

我将我的工具链从 arm_eabi-2011.03 更新到 arm-2012.09。然后问题出现了。我必须将 INCLUDEd 文件复制到我的链接脚本中,以避免出现“标志”问题。

我想知道新版本的工具链怎么会破坏旧版本的功能?

于 2014-10-31T22:05:39.373 回答