如何解决链接描述文件中的错误?

时间:2014-02-11 14:11:06

标签: c linux gcc linker ld

我创建了一个内存链接器脚本并将其保存为eclipse中的memory.ld:项目:属性:gcc链接器:杂项:我添加了-M -T memory.ld

memory.ld:

    MEMORY
{
        ram (rw)   : ORIGIN = 0x4000000 ,  LENGTH = 2M  
}

SECTIONS
{
  RAM : { *(.myvarloc) 

} > ram }

在我的c程序中:我做了一个全局声明:

__attribute__ ((section(".myvarloc")))

 uint8 measurements [30];

错误:

/usr/bin/ld: FEBRUARY section `.text' will not fit in region `ram'
/usr/bin/ld: region `ram' overflowed by 20018 bytes
/usr/lib/i386-linux-gnu/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0x2b): undefined reference to `__init_array_end'
/usr/lib/i386-linux-gnu/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0x31): undefined reference to `__init_array_start'
/usr/lib/i386-linux-gnu/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0x57): undefined reference to `__init_array_start'
/usr/bin/ld: FEBRUARY: hidden symbol `__init_array_end' isn't defined
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status

1 个答案:

答案 0 :(得分:1)

根据您使用的编译器(GCC?)和您要编译的处理器(x86?),编译器将在目标文件中生成多个段引用。最常见的代码段为.text,初始化数据为.data,未初始化数据为.bss。 您可以使用对象文件上的nm实用程序查看编译器生成的段 我假设在您提供自己的链接描述文件之前,环境已自动和/或隐式地提供了一些默认脚本。但既然你已经决定推出自己的",你必须自己处理所有细节。

我无法验证详细信息,但您可以从以下SECTIONS开始:

SECTIONS
{
  .bss : { *(.myvarloc) } 
  .bss : { *(.bss) }
  .data : { *(.data) }
  .text : { *(.text) }
}

我不确定这是否是您的GCC链接器的确切语法(它在某种程度上取决于版本),但您可以在the manual中找到更多信息。