Gcc 如何在ld链接器脚本中使用INCLUDE命令

Gcc 如何在ld链接器脚本中使用INCLUDE命令,gcc,include,linker-scripts,Gcc,Include,Linker Scripts,我有两个链接器脚本:common.ld,它定义了一些符号;和app.ld,它使用这些定义来定位节 如果我只是将这两个文件放在一起,然后将它们输入到ld(通过gcc),它就可以工作了。 如果我使用INCLUDE命令: 包括common.ld 我得到一个错误: ld.exe:标志中的语法无效 collect2:ld返回了1个退出状态 我做错了什么?包含另一个加载脚本的正确语句是什么 发件人: 包括文件名 此时包括链接器脚本文件名。将在中搜索该文件 当前目录,以及使用-L选项指定的任何目录中。你可以

我有两个链接器脚本:
common.ld
,它定义了一些符号;和
app.ld
,它使用这些定义来定位节

如果我只是将这两个文件放在一起,然后将它们输入到ld(通过gcc),它就可以工作了。 如果我使用
INCLUDE
命令:

包括common.ld

我得到一个错误:

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

collect2:ld返回了1个退出状态

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


发件人:

包括文件名

此时包括链接器脚本文件名。将在中搜索该文件 当前目录,以及使用-L选项指定的任何目录中。你可以嵌套呼叫 可包含多达10层的深度

注意:我正在Windows 7 PC上运行此程序,使用arm gcc工具,代码为红色,完整版本:


arm none eabi gcc(用于arm嵌入式处理器的GNU工具)4.6.2 20121016(发行版)[arm/Embedded-4_6-branch修订版192487

包含语法应该正确,
include common.ld在这里工作正常


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

这一个很有趣。显然ld命令文件lexer中有一个错误。我使用的是binutils 2.24版本,并且有相同的问题。您的一个附带文件有类似的内存命令

MEMORY
{
  rom (rx) : ORIGIN = 0x00000000, LENGTH = 64M
  ram (!rx) : ORIGIN = 0x48000000, LENGTH = 32M
}
我认为(但尚未证明)lexer正在为包含文件中的第二个属性返回“!rx”而不是“rx”

MEMORY
{
  rom (rx) : ORIGIN = 0x00000000, LENGTH = 64M
  ram (! rx) : ORIGIN = 0x48000000, LENGTH = 32M
}
修复了问题。我查看了ld源中的ldlex.l和ldgram.y,但在我的眼睛开始痛之前,没有发现明显的错误


错误报告:

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


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

我刚刚发现搜索链接器脚本中包含的信息。您还需要帮助吗?调用链接器所执行的命令行是什么?我认为“标志”中有错误将在命令处而不是在文件中发生。嗨。我没有任何称为“flags”的符号名或链接器文件名。我现在已经在makefile中使用sed并在链接之前替换include语句来解决这个问题,这很好。两个文件都位于同一个目录中,因此文件肯定可以链接器的nd。好的,谢谢分享这项工作。我想当它说“标志”时,它的意思是“选项”就像命令行选项一样。是的!Genious,它修复了它。谢谢!这个bug可以被跟踪到哪里吗?@richard_pennington那太好了。你已经这样做了吗?我在bug列表中找不到它。我也看了一下,但也没找到它。有趣的是,
ld
似乎在项目中没有bug的默认受让人vel.:|我想对解析规则的更改测试得不够彻底。你试过上面接受的答案(感叹号后面的空格)了吗?它帮了我的忙。