2010-03-29 168 views
5

我是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」變量在I中所定義的鏈接腳本文件中的地址,並在「SEG_HEADER」其餘變量中所定義上面的鏈接描述文件。

但是在編譯時,當我查看.hex文件時,不同的節變量位於不同的十六進制記錄中,位於地址0x00處,而不是鏈接器腳本文件中給出的。

請幫助我將鏈接描述文件鏈接到源代碼。

是否有任何命令行選項鍊接鏈接腳本文件,如果任何plese提供信息如何使用選項。

在此先感謝,

SureshDN。

回答

2

嘗試gcc -Xlinker -T (linker script name) (c sources files)

2

我第一次編譯我的所有的C文件編譯成目標文件,然後用它們鏈接起來:

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

從GCC文檔:

`-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

感謝迴應,

我找到了一個m GCC中的鏈接選項選項,「ld」和選項-T將鏈接鏈接到源代碼。

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

感謝 蘇雷什