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 在一直更新,以后个能会有新的功能
本文来自博客园,作者:IC铲屎官,转载请注明原文链接:https://www.cnblogs.com/ICkeeper/p/15514775.html

浙公网安备 33010602011771号