我有两个链接描述文件:common.ld
定义了一些符号,app.ld
定义了这些符号。
如果我只将两个文件合并在一起,并将其提供给ld(通过gcc),它就可以了。
如果我使用INCLUDE
命令:
包含common.ld
我收到错误:
ld.exe:flags
中的语法无效collect2:ld返回1退出状态
我做错了什么?包含另一个加载脚本的正确语句是什么?
来自http://www.scoberlin.de/content/media/http/informatik/gcc_docs/ld_3.html#IDX204:
包含文件名
此时包含链接描述文件名。该文件将在中搜索 当前目录,以及使用-L选项指定的任何目录。你可以嵌套电话 最多可包含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
答案 0 :(得分:7)
这个很有意思。显然,ld命令文件lexer中存在一个错误。我正在使用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,但在我的眼睛开始受伤之前找不到明显的错误。
答案 1 :(得分:1)
include语法应该是正确的,INCLUDE common.ld
在这里工作正常。
也许Windows版本的ld有错误,或者你的任何一个链接器脚本或环境都有问题?
答案 2 :(得分:0)
我将我的工具链从arm_eabi-2011.03更新为arm-2012.09。然后问题出现了。我必须将INCLUDEd文件复制到我的链接脚本,以避免"标记"问题。
我想知道新版本的工具链怎么会破坏旧版本的功能呢?