首页 > 其他分享 >GNU链接器(LD):使用链接脚本符号统计存储器使用率

GNU链接器(LD):使用链接脚本符号统计存储器使用率

时间:2024-10-20 08:51:54浏览次数:3  
标签:__ LD GNU SYSRAM 地址 符号 链接

0 参考资料

GNU-LD-v2.30-中文手册.pdf
GNU linker.pdf

1 前言

一个完整的编译工具链应该包含以下4个部分:
(1)编译器
(2)汇编器
(3)链接器
(4)lib库
在GNU工具链中,对应的是:
(1)编译器:GCC(GNU Compiler Collection,GNU编译器套件)
(2)汇编器:GAS(GNU Assembler,GNU汇编器)
(3)链接器:LD(GNU Linker,GNU链接器)
(4)lib库:glibc(GNU C Library,GNU C 库)
本文介绍使用链接脚本符号统计存储器使用率的方法。

2 GNU链接器(LD):使用链接脚本符号统计存储器使用率

本例演示使用链接器脚本符号统计SYSRAM使用率。

 .SYSRAM (NOLOAD):
  {
    . = ALIGN(4);
    __SYSRAM_START__ = .;
    *(.SYSRAM);
    __SYSRAM_END__ = .;
    . = ALIGN(4);
  } >SYSRAM

这里定义分区名为.SYSRAM,属性为不加载,加载存储区域为SYSRAM。定义了2个符号分别是__SYSRAM_START__、SYSRAM_END,输入分区为所有输入文件中包含.SYSRAM关键字的段。假如我们需要把变量定义在SYSRAM中,可以在C中这么写:

uint8_t uart4RXBuff[128] __attribute__((section(".SYSRAM"))) = {0};

这样操作后,uart4RXBuff变量就会被分配到SYSRAM(SYSRAM存储地址:0x2ffe0000-0x2fffffff)中。查看.map文件如下:
在这里插入图片描述
__SYSRAM_START__和__SYSRAM_END__符号被定义在SYSRAM存储空间的起始和结束位置。查看.map文件如下:
在这里插入图片描述
既然知道了SYSRAM中指定变量起始地址和结束地址,只要将结束地址-起始地址即可得到SYSRAM内存使用大小:

extern u32 __SYSRAM_START__;
extern u32 __SYSRAM_END__;
u32 sysram_use_size = (u32)&__SYSRAM_END__ - (u32)&__SYSRAM_START__;

这里要注意,链接脚本中的符号__SYSRAM_START__、__SYSRAM_END__并不会分配真正的存储空间用来保存数据,只在编译阶段使用。因此应当在.c中取符号地址而不是直接使用符号进行操作。结果如下:
在这里插入图片描述
对应的汇编代码如下:
在这里插入图片描述
编译器将SYSRAM开始地址和结束地址写入r1、r2,然后执行r2=r2-r1便可以得到SYSRAM内存使用大小。

计算结果为1344字节,和.map显示的实际字节占用数0x540(1344)一致:
在这里插入图片描述
如果我们直接对符号进行-操作,对应的汇编代码如下:
在这里插入图片描述
编译器将SYSRAM开始地址和结束地址写入r1、r2,然后加载r1、r2作为指针指向对象的值到r1、r2,由于链接器脚本符号本身不会分配实际的存储空间,因此无法获取到正确的起始地址和结束地址,也就无法得到正确SYSRAM占用率。
打印结果如下:
在这里插入图片描述

标签:__,LD,GNU,SYSRAM,地址,符号,链接
From: https://blog.csdn.net/kevin1499/article/details/142433386

相关文章

  • 处理R动态链接库确实得问题
    参考文档https://askubuntu.com/questions/1409562/error-while-loading-shared-libraries-libicudata-so-66-libicudata-so-66-and-lib要使用清华镜像源来解决libicu66的问题,可以按照以下步骤更新的sources.list文件:打开sources.list文件:sudogedit/etc/apt/sources......
  • Scala的fold
    fold的解释为:对数组的每个元素执行指定的二元折叠操作。注意:fold与reduce和reduceleft的区别在于fold有一个初始值,在取值运算的过程中第一个元素需要与初始值进行运算,再一次进行下一步的运算。fold作用:fold是一种集合操作(与reduce类似),用于对集合中的元素进行聚合操作,返回一个......
  • windows安装Android studio并运行显示"hello world"
    闲言本次流程的最终实现目的,正确安装AndroidStudio,并实现运行成功希望能帮到大家目录闲言安装前准备下载AndroidStudio安装新建项目第一次创建情况如果proxy未在创建新项目时出现运行创建虚拟机运行虚拟机碎语安装前准备下载AndroidStudio官网链接https://devel......
  • 常用APIStringBuilder类
    StringBuilder代表可变字符串对象,相当于是一个容器,它里面的字符串是可以改变的,就是用来操作字符串的。好处:StringBuilder比String更合适做字符串的修改操作,效率更高,代码也更加简洁。1StringBuilder方法演示1.1字符串拼接接问题:builder.append();可以拼接int、long、d......
  • 华为云计算学习笔记——FusionAccess发放链接克隆云桌面等
    发放链接克隆云桌面制作链接克隆模板安装win10-专业版,启用administrator,关闭防火墙,安装tools(自动通过dhcp获取ip地址),封装模板(链接克隆)为什么链接克隆这里要加域:你可以勾选跳过,后面发放的时候,会执行加域的动作,但是这样就会增加发放云桌面的时间(比如你发放了10台,会占用发放的时间),为了......
  • HDLBits中文版,标准参考答案 | 3.3 Building Larger Circuits | 构建更大的电路
    关注 望森FPGA 查看更多FPGA资讯这是望森的第21期分享作者|望森来源|望森FPGA目录1Counterwithperiod100024-bitshiftregisteranddowncounter3FSM:Sequence1101recognizer4FSM:Enableshiftregister5FSM:ThecompleteFSM6Thecomplet......
  • flume传输数据报错“Space for commit to queue couldn‘t be acquired. Sinks are li
        最近在写一个数据量比较大的项目时候,需要使用flume将kafka中的数据传输到HDFS上进行存储,方便后续的数仓搭建,但是flume在传输数据中却报错如下日志org.apache.flume.ChannelFullException:Spaceforcommittoqueuecouldn'tbeacquired.Sinksarelikelynot......
  • Tomcat10JdbcPoolDemo
    packagecom.renguanyu.demo;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.Statement;importorg.apache.tomcat.jdbc.pool.DataSource;importorg.apache.tomcat.jdbc.pool.PoolProperties;publicclassTomcat10JdbcPoolDemo{ public......
  • 深度学习_多层感知机基于Heart Disease UCI 数据集中的processed.cleveland.data训练
    多层感知机(Muti-Layerperceptron)#1.数据导入importpandasaspdnames=["age","sex","cp","trestbps","chol","fbs","restecg",......
  • C++ 基础-面试题01(C和C++区别、C结构体和C++结构体区别、C和C++ static区别、a和&a区
    1.C和C++的区别特性CC++编程范式面向过程编程面向对象编程+面向过程编程+泛型编程类和对象不支持类和对象支持类和对象,封装、继承、多态等特性标准库标准库有限,如stdio.h、stdlib.h丰富的标准库,如STL(容器、算法)函数和运算符重载不支持支持内存管理手动管理,使用malloc......