如何在ld链接描述文件中使用INCLUDE命令

时间:2013-10-08 15:35:36

标签: gcc include linker-scripts

我有两个链接描述文件: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

3 个答案:

答案 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,但在我的眼睛开始受伤之前找不到明显的错误。

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

答案 1 :(得分:1)

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

也许Windows版本的ld有错误,或者你的任何一个链接器脚本或环境都有问题?

答案 2 :(得分:0)

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

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