GCC链接器-为存档文件中包含的代码指定输出部分

GCC链接器-为存档文件中包含的代码指定输出部分,gcc,linker,ld,linker-scripts,Gcc,Linker,Ld,Linker Scripts,背景 我正在使用用于ARM嵌入式处理器编译器的GNU工具,这是一个GCC编译器。我目前在Windows环境中工作 我正在构建一个相对较大的项目,并已成功编译了所有源代码,但在链接阶段面临挑战。这个特定的平台是RAM的两个独立区域,我需要将目标代码的某些部分映射到特定区域 我认为我应该能够使用链接器脚本,例如: SECTIONS { ER_CCM 0x10000000: { * (.bss) } ER_SRAM 0x20000000: { so

背景

我正在使用用于ARM嵌入式处理器编译器的GNU工具,这是一个GCC编译器。我目前在Windows环境中工作

我正在构建一个相对较大的项目,并已成功编译了所有源代码,但在链接阶段面临挑战。这个特定的平台是RAM的两个独立区域,我需要将目标代码的某些部分映射到特定区域

我认为我应该能够使用链接器脚本,例如:

SECTIONS
{
   ER_CCM 0x10000000:
   {
      * (.bss)
   }
   ER_SRAM 0x20000000:
   {
      someLib.obj (.bss)
   }
}
但是,我的问题是编译器输出的是.lib文件(归档文件),而不是.obj文件。正在使用以下语法在所有存档文件的当前目录中调用链接器:

ld.exe--library path=C:\SomePath\lib--Map C:\SomePath\bin\mapfile.Map--script=C:\SomePath\bin\linkscript.ldf-(file1.lib file2.lib…)

即使.lib文件包含对.obj文件的引用,链接器也会抱怨它找不到文件
someLib.obj
,可能是因为它没有给定的完整路径来知道映射所引用的文件

向链接器提供链接器脚本中的完整路径似乎也不起作用;指定对象文件中包含的符号仍显示在内存的第一部分中

问题

示例链接器脚本中的语法有效吗?第一节中的通配符是否会阻止正确映射该节中指定的文件


如何指定链接器将存档文件中的某些对象文件映射到特定区域?这是可能的吗?

事实证明,我的主要问题是重复的,尽管我也问了通配符的位置/顺序,我将保留这个问题

我的第一个任务的答案是:将通配符条目放在其他部分之前阻止其他部分正确导入指定的对象文件。这种行为是特定于链接器的,因为我见过其他链接器不是这样的

解决此问题的方法是确保将泛型部分放在链接器脚本的最后:

SECTIONS
{
   ER_SRAM 0x20000000:
   {
      someLib.obj (.bss)
   }
   ER_CCM 0x10000000:
   {
      * (.bss)
   }
}
至于引用存档(.lib)文件中包含的对象文件。链接帖子中给出了答案,但这里又是:

向delcaration部分中的嵌入对象文件添加通配符:

ER_SRAM 0x20000000:
{
   *someLib.obj (.bss)
}
这里需要注意的是,由于在对象文件名中使用了通配符,如果文件丢失或条目拼写错误,链接器将不会抛出错误