首页 > 其他分享 >riscv linker relaxations 是什么

riscv linker relaxations 是什么

时间:2024-01-19 20:11:49浏览次数:29  
标签:global gp riscv linker relaxations a5 寄存器

什么是linker relaxations

由于链接时携带一些符号地址信息,可以执行一些编译时难以或者不大可能实现的优化。Linker Relaxtion 与传统编译时期的优化是不一样的,此优化发生在链接时。通常情况下,在链接时,改变代码的执行序列是有风险的,因为语义信息此时会丢失,链接器看到也仅是字节流信息。

gp,global pointer,全局指针寄存器,RISC-V 32个寄存器之一,为了优化±2KB内全局变量的访问。

gp寄存器在启动代码中加载为__global_pointer$的地址,并且之后不能被改变。

linker时使用__global_pointer$来比较全局变量的地址,如果在范围内,就替换掉luipuipc指令的 absolute/pc-relative寻址,变为gp-relative寻址,使得代码效率更高。该过程被称为linker relaxation(链接器松弛),也可以使用-Wl,--no-relax来关闭此功能。

如:需要读取全局变量 tao_global的值,地址位0x20000100,gp指针地址为0x20000800;

普通调用方式为:

lui a5,0x20000   /* 将0x20000100高20位0x20000 左移12位赋给a5寄存器 */
lw  a5,256(a5)   /* 加载a5+256(0x100,0x20000100低12位)的值至a5寄存器 */

gp指针优化调用方式:

lw a5,-1792(gp) /* 加载gp-1792地址处的值至a5,即0x20000100处的值*/

通过gp指针,访问其值±2KB,即4KB范围内的全局变量,可以节约一条指令。

其他

编译器linker relaxations 默认是开启的。通过 -mrelax或者-mno-relax来开启和关闭此功能

Ref

https://www.cnblogs.com/wahahahehehe/p/15140813.html
https://www.sifive.com/blog/all-aboard-part-3-linker-relaxation-in-riscv-toolchain

标签:global,gp,riscv,linker,relaxations,a5,寄存器
From: https://www.cnblogs.com/lvzh/p/17975491

相关文章

  • the ObjectARX system dynamic linker object
    ObjectARXReferenceGuide>Macros>AcRxMacros>acrxDynamicLinkerMacroacrxDynamicLinkerC++defineacrxDynamicLinker\AcRxDynamicLinker::cast(acrxSysRegistry()->at(ACRX_DYNAMIC_LINKER))Filerxdlinkr.hDescriptionTheacrxDynamicLinkerm......
  • Linkerd 的未来趋势: 如何适应变化
    1.背景介绍随着微服务架构的普及,服务间的通信变得越来越复杂。Linkerd作为一款高性能的服务网格,为Kubernetes提供了一种新的方法来解决这些问题。在这篇文章中,我们将探讨Linkerd的未来趋势,以及如何适应这些变化。1.1微服务架构的挑战微服务架构的核心思想是将应用程序拆分成......
  • Linkerd
    Linkerdisa servicemesh forKubernetes.Itmakesrunningserviceseasierandsaferbygivingyouruntimedebugging,observability,reliability,andsecurity—allwithoutrequiringanychangestoyourcode.InstallationEnsureyouhaveaccesstotheKuber......
  • riscv gnu编译器
    官网https://github.com/riscv-collab/riscv-gnu-toolchain编译器基于RISC-V交叉编译器包括32bit和64bit两种类型,其中每种类型又包括裸机版本(newlib)和动态链接库版本(linuxglibc)newlib./configure--prefix=/opt/riscvmakeglibc#默认仅支持64位target./configure--......
  • 学习riscv(1)安装tinyriscv的工具链
    因为毕设是CPU的低功耗设计,所以开始看cpu,打算还是先从这个tinyriscv学起,昨天把环境下好了,第一步是用git去clone代码,这个首先要下载git,然后在目标文件夹鼠标右键,选择“opengitbushhere”,再输入项目的url,就可以了。方法不难。b站有详细教程接下来是安装工具,我用的是wind......
  • mitos - xv6 for riscv
    参考:code:https://github.com/mit-pdos/xv6-riscvbook:https://pdos.csail.mit.edu/6.828/2021/xv6/book-riscv-rev2.pdfnote:https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/......
  • binutils 2.40 Linker (ld) 官方文档下载
    前言最近需要熟悉elf与共享库的链接与加载流程,需要先了解elf文件是怎么链接的,链接脚本如何阅读最有效的方式是查看GNU官方的Linker(ld)文档,通过查找,这个Linker(ld)属于GNUbinutils,当前的较新的版本为:2.40binutilsLinker(ld)文档文档地址:https://sourceware.o......
  • EDA工具使用+GIT操作+python编程+C语言编程+Riscv相关+TCL操作
    EDA工具使用Verdi覆盖率转网页urg-full64-dirsimv.vdbVerdi加载sessionverdi-ssrsessionFileVcs分部编译额外选项-partcomp:自动分块编译。-fastpartcomp:使用多核计算系统并行部分编译。-pcmakeprof:查看每部分编译占用的时间,方便对时间更久的进行拆分。-partc......
  • Rust,linker but `link.exe` was not found
    themsvctargetsdependonthemsvclinkerbut`link.exe`wasnotfound这是提示未安装vsstudioc++组件,由于vsstudio组件较大,可以选择安装gnu的,具体如下:命令行执行下边指令rustuptoolchaininstallstable-x86_64-pc-windows-gnurustupdefaultstable-x86_64-pc-wind......
  • qemu搭建riscv的可调试环境
    qemu搭建riscv的可调试环境riscv工具链(网上大多数用Github直连的工具链,但是因为太大,download的时候老是出问题)选择使用Cross-compilationtoolchainsforLinux-Home(bootlin.com)进行下载,之后解压。bin目录下为可执行的工具链,将其添加到PATH中。qemuqemu压缩包下载......