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

发布于 2024-08-26 12:55:51 字数 1788 浏览 5 评论 0原文

我是 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。

I am new to GNU compiler.

I have a C source code file which contains some structures and variables in which I need to place certain variables at a particular locations.

So, I have written a linker script file and used the __ attribute__("SECTION") at variable declaration, in C source code.

I am using a GNU compiler (cygwin) to compile the source code and creating a .hex file using -objcopy option, but I am not getting how to link my linker script file at compilation to relocate the variables accordingly.

I am attaching the linker script file and the C source file for the reference.

Please help me link the linker script file to my source code, while creating the .hex file using GNU.

/*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 source code:

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; 

My intention is to place the variables of section "BASE_TABLE" at the address defined i the linker script file and the remaining variables at the "SEG_HEADER" defined in the linker script file above.

But after compilation when I look in to the .hex file the different section variables are located in different hex records, located at an address of 0x00, not the one given in linker script file .

Please help me in linking the linker script file to source code.

Are there any command line options to link the linker script file, if any plese provide me with the info how to use the options.

Thanks in advance,

SureshDN.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

心房敞 2024-09-02 12:55:51

尝试gcc -Xlinker -T(链接器脚本名称)(c 源文件)

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

深府石板幽径 2024-09-02 12:55:51

我首先将所有 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.

I first compile all my c files to object files and then link them with:

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

From The 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.
时间你老了 2024-09-02 12:55:51

感谢您的回复,

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

ld -T(链接器脚本名称)-o(最终目标文件)(源文件的目标文件)

谢谢
苏雷什

Thanks for the response ,

I have found one more linker option in GCC ,"ld" and teh option -T to link the sections to the source code.

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

Thanks
Suresh

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文