Linker 对两个文件使用相同的链接器ld脚本文件目标

Linker 对两个文件使用相同的链接器ld脚本文件目标,linker,embedded,ld,Linker,Embedded,Ld,假设我有一个如下所示的内存分配: MEMORY { firstfile : ORIGIN = 0x00000000, LENGTH = 0x2000 secondfile : ORIGIN = 0x00002000, LENGTH = 0x6000 } 现在我想对两个不同的文件使用相同的ld脚本firstfile.c'和'secondfile.c' 如何将第一个文件整个分配置于“第一个文件”部分下,将第二个文件置于“第二个文件”部分下 目前.text都在secondfile

假设我有一个如下所示的内存分配:

MEMORY
{
    firstfile  : ORIGIN = 0x00000000, LENGTH = 0x2000 
    secondfile : ORIGIN = 0x00002000, LENGTH = 0x6000
}
现在我想对两个不同的文件使用相同的ld脚本firstfile.c'和'secondfile.c' 如何将第一个文件整个分配置于“第一个文件”部分下,将第二个文件置于“第二个文件”部分下

目前.text都在secondfile部分下。
在链接器脚本片段
firstfile
secondfile
中,对firstfile.c中的每个函数使用特殊属性section没有帮助,因为它们是
内存
区域而不是
,因此节属性(我猜)将被忽略,因为节不存在

必须创建
内存
区域,在其中放置
,然后将目标代码中定义的节分配给链接器脚本中声明的节。请注意,找到的是目标代码,而不是源文件-链接器对源文件一无所知:

比如:

MEMORY
{
    FIRST_MEMORY  : ORIGIN = 0x00000000, LENGTH = 0x2000 
    SECOND_MEMORY : ORIGIN = 0x00002000, LENGTH = 0x6000
}

SECTIONS
{
  .firstsection :
  {
    . = ALIGN(4);

    *firstfile.o (.text .text*)   /* Locate firstfile text sections here */

  } > FIRST_MEMORY

  .secondsection :
  {
    . = ALIGN(4);

    *secondfile.o (.text .text*)  /* Locate secondfile text sections here */

  } > SECOND_MEMORY
}
然后,您可以将任意数量的模块显式地定位到每个部分

您可能需要一个默认位置来放置未显式定位的模块。在这种情况下,您应该添加:

*(.text)           /* .text sections (code) */
*(.text*)          /* .text* sections (code) */
到其中一个部分(或创建单独的默认
.text
部分)

此外,如果您添加:

*(.firstsection*)  /* Locate anything with firstsection attribute here */

对于相应的部分,您可以使用代码中的
\uuuuu section\uuuuu
属性定位到这些部分的特定功能(或数据),就像您之前尝试的那样。但定位整个模块更可取,因为它不需要修改和维护代码

*(.secondsection*) /* Locate anything with secondsection attribute here */