将链接器脚本文件链接到源代码

时间:2010-03-29 10:02:41

标签: c embedded gnu

我是GNU编译器的新手。

我有一个C源代码文件,其中包含一些结构和变量,我需要在特定位置放置某些变量。

所以,我编写了一个链接描述文件,并在C源代码中的变量声明中使用了 __ attribute__("SECTION")

我正在使用GNU编译器(cygwin)来编译源代码并使用-objcopy选项创建.hex文件,但我没有得到如何在编译时链接我的链接器脚本文件以相应地重定位变量

我附加了链接描述文件和C源文件以供参考。

请使用GNU创建.hex文件时帮助我将链接描述文件链接到我的源代码。

/*linker script file*/
/*defining memory regions*/

      MEMORY
      {
         base_table_ram     : org = 0x00700000, len = 0x00000100  /*base table area for BASE table*/ 
         mem2               : org =0x00800200,  len = 0x00000300 /* other structure variables*/
      }
/*Sections directive definitions*/ 

      SECTIONS
      {
        BASE_TABLE    : { }  > base_table_ram

        GROUP                  :
           {
                   .text        : { } { *(SEG_HEADER)  }
                   .data        : { } { *(SEG_HEADER)  }
                   .bss         : { } { *(SEG_HEADER)  }

           } > mem2

      }

C源代码:

const UINT8 un8_Offset_1 __attribute__((section("BASE_TABLE")))  = 0x1A; 
const UINT8 un8_Offset_2 __attribute__((section("BASE_TABLE")))  = 0x2A; 
const UINT8 un8_Offset_3 __attribute__((section("BASE_TABLE")))  = 0x3A; 
const UINT8 un8_Offset_4 __attribute__((section("BASE_TABLE")))  = 0x4A; 
const UINT8 un8_Offset_5 __attribute__((section("BASE_TABLE")))  = 0x5A;     
const UINT8 un8_Offset_6 __attribute__((section("SEG_HEADER")))  = 0x6A; 

我的目的是将“BASE_TABLE”部分的变量放在链接描述文件中定义的地址和上面链接描述文件中定义的“SEG_HEADER”的剩余变量中。

但是在编译之后,当我查看.hex文件时,不同的部分变量位于不同的十六进制记录中,位于地址0x00,而不是链接描述文件中给出的那个。

请帮助我将链接描述文件链接到源代码。

是否有任何命令行选项来链接链接器脚本文件,如果有任何请求提供有关如何使用这些选项的信息。

提前致谢,

SureshDN。

3 个答案:

答案 0 :(得分:2)

尝试gcc -Xlinker -T (linker script name) (c sources files)

答案 1 :(得分:2)

我首先将所有c文件编译为目标文件,然后将它们链接到:

gcc -Xlinker -T"xxx.lds" (all object files)

来自gcc docs:

`-Xlinker OPTION'
    Pass OPTION as an option to the linker.  You can use this to
    supply system-specific linker options which GNU CC does not know
    how to recognize.

答案 2 :(得分:2)

感谢您的回复,

我在GCC中找到了另外一个链接器选项,“ld”和teh选项-T将这些部分链接到源代码。

ld -T (linker scriptname) -o (final objfile) (objectfile of source file)

由于 苏雷什