RISCV GCC 链接文件 常用命令

一、常用符号
 
ENTRY(SYMBOL) 
        将符号 SYMBOL 设置为程序的入口地址
        入口地址是进程执行的第一条指令在程序空间的地址。连接器 ld 中其他设置程序入口地址的方式包括:
        
        1、采用 ld 命令行的参数 -e;
        2、如果定义了 start 符号,则使用 start 符号值
    如:
      ENTRY(_start)  
    这里面就会先去搜索 _start 这个符号。
        3、如果存在  .text section , 则使用  .text section 的第一字节的位置值
 
  
 
 
INCLUDE  filename
 
       包含名称为 filename 的其他连机器过程的输入文件
       
INPUT(file,file,...)
 
        将括号内的文件作为链接过程的输入文件
 
GROUP(file,file,...)
    
        指定需要重复搜索符号的多个输入文件。 file 必须是库文件, 且 file 文件被ld 重复扫描,知道不再有新的未定义的引用出现
 
OUTPUT(filename)
 
        定义输出文件的名字,等同于 ld 命令行参数 “-o filename”. 如果同时使用脚本文件和命令行参数,则命令行参数的优先级更高
 
STARTUP(filename)
 
        制定 filename 为第一个输入文件
 
OUTPUT_ARCH(BFDARCH)
 
            设置输出文件对应的处理器架构
 
OUTPUT_FORMAT(BFDNAME)
 
        设置输出文件使用的 BFD 格式,等同于 ld 命令行参数 “-o format BFDNAME” 。 如果同时使用脚本文件和命令行参数,则命令行参数的优先级更高。
 
 
 
    
section
说明
.sdata
作为 8 字节或更少字节标量的全局变量或者静态变量,其值可能会被程序更改,应作为 .sdata(有初始值并且初始值不为0) 条目访问
.sbss
作为 8 字节或更少字节标量的全局变量或者静态变量,其值可能会被程序更改,应作为 .sbss (无初始值或者初始值为0)条目访问
.data
超过 8 字节标量的全局变量或者静态变量,其值可能会被程序更改,应作为  .data(有初始值切并且初始值不为0) 条目访问。
.bss
超过 8 字节标量的全局变量或者静态变量,其值可能会被程序更改,应作为  .bss (无初始值或者初始值为0)条目访问。
.rodata
目前const 声明的变量仍然是放在 .rodata  中,不存在大小区别的

 

 

 

二、举例

 

 

 MEMORY
 {
   TEST_MEMORY1(rwx) : ORIGIN = 0x100 , LENGTH = 0x200 
   TEST_MEMORY2(rwx) : ORIGIN = 0x400 , LENGTH = 0x200
 }
 

 SECTIONS
{
    .TEST_MEMORY2_SYMBOL   ALIGN(16):{ TEST_M2_START =  . ; } > TEST_MEMORY2
 
 
     . = 0x100;
     .L1 : AT(TEST_M2_START )
     {
     
     
     _TEST_start = . ;
     *(mydata)
   KEEP(*(mydata_unused)) _TEST_end
= ALIGN(8) ; } > TEST_MEMORY1 }

 

 

 

  MEMORY

  描述目标中内存块的位置和大小。 您可以使用它来描述链接器可以使用哪些内存区域,以及它必须避免使用哪些内存区域。

  其中 

    

   TEST_MEMORY1 表示外设名称

   ORIGIN 后面接的是 这个外设的起始地址,

    LENGTH 后面接的是外设的地址长度

  ALIGN(16) 表示 16字节对齐



AT(TEST_M2_START ) : 表示这个段是存储在 TEST_M2_START 地址上的
 
_TEST_start = . ; 给 _TEST_start 赋予 当前地址值,这个符号可以在C 里面值引用, 
   如:
       int a = &_TEST_start;
      这个时候 a 的值就是 _TEST_start 代表的地址;
*(mydata)  表示 section 为 mydata 的段

_TEST_end = ALIGN(8) ; 给 _TEST_end 赋予 当前地址值,且该值是8 字节对齐的。
KEEP 表示保留这个节,因为有些程序里面没有显示的调用某些节里面的函数,编译器会自动删除对应的节,所以使用KEEP 可以把它保留下来。



  

LLVM 和 GCC 在一直更新,以后个能会有新的功能

 

posted @ 2021-11-05 18:57  IC铲屎官  阅读(620)  评论(0)    收藏  举报