首页 > 其他分享 >C代码中如何使用链接脚本中定义的变量?

C代码中如何使用链接脚本中定义的变量?

时间:2023-07-03 11:04:45浏览次数:42  
标签:__ end 定义 int bss start foo 链接 变量


交流群一:QQ群:869222007(鸿蒙开发/Linux/嵌入式/驱动/资料下载)
交流群二:QQ群:536785813(单片机-嵌入式)
公 众 号:百问科技


版本

日期

作者

说明

V1

2020

韦东山

技术文档


在链接脚本中,经常有这样的代码:

SECTIONS
{
.....
. = ALIGN(4);
.rodata : { *(.rodata) }

. = ALIGN(4);
.data : { *(.data) }

. = ALIGN(4);
.got : { *(.got) }

. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}

其中__bss_start, _end 表示BSS段的起始、终止地址。

我们想对这段空间清零时,
1.在汇编代码中,可以直接引用__bss_start, _end,比如:

ldr r0, =__bss_start
ldr r1, =_end

2.在C代码中,我们不能直接引用它们,要这样做:

void clean_bss(void)
{
extern int __bss_start, _end;
int *p = &__bss_start;
   
for (; p < &_end; p++)
        *p = 0;
}

你可能会疑惑:__bss_start, _end不是表示某个值吗?在C代码中为什么要使用取址符号 & ?

原因:
一,在C代码中,这样的语句:

int foo = 1000;

会导致2件事情发生:

  1. 在代码中,留出4字节的空间,保存数值1000
  2. 在C语言的symbole talbe,即符号表中,有一个名为foo的项,它里面存有那4字节空间的地址。

我们执行 foo = 1时,会先去符号表中找到foo对应的地址,然后把数值1填到那个地址对应的内存;

我们执行 int *a = &foo时,会直接把符号表中foo的地址,写给a。

二,在链接脚本中,假设

__bss_start = 1000

__bss_start并不是一个变量,它只是一个值,并不需要在内存中留出一段空间来保存它;

在C语言中,符号表中会有一个名为__bss_start的项,这个项目中的值(地址值)是1000;

注意,这个1000并没有实际存在的内存。

三.
所以:在C语言中,要去使用链接脚本中定义的值时,应该这样做:

extern int __bss_start;
int val = &__bss_start;

使用取址符号&去得到它在符号表中的值。
注意,这个值只是链接脚本中定义的值,并不表示某个变量的地址。


标签:__,end,定义,int,bss,start,foo,链接,变量
From: https://blog.51cto.com/weidongshan/6609516

相关文章

  • 01-变量
    为什么需要变量?变量是程序的基本组成单位(不论使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位)变量的概念变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,而通过变量名可以访问到变量(值)变量三要素:变量=变量......
  • 关于 TypeScript 的变量声明和解构赋值(Destructuring Assignment)
    看下面这段代码:const{queryParams,fragment}=this.router.parseUrl(url);const[,path]=url.match(this.URL_SPLIT)??[,''];这段TypeScript代码虽然较短,但仍然展示了许多TypeScript的特性和语法。以下是对这段代码的分析,涵盖了相关的TypeScript特性和语法。......
  • 环境变量与模式
    前言vite.config.js是运行在node环境下的,vite会将esmodule转化为commonjs。服务端区分环境dotenvvite内置了dotenv这个第三方库,他会自动读取.ev文件,并将其注入到process对象下。但是Vite默认是不加载.env文件的,因为这些文件需要在执行完Vite配置后才能确定加载哪一个,举......
  • ES 中文分词器ik及自定义远程词库
    ik分词器安装部署 下载地址:https://github.com/medcl/elasticsearch-analysis-ik注意es和ik分词器的版本匹配.这里下载7.9.3的ik分词器下载完毕之后去es的工作目录的plugins文件夹下新建ik文件夹,将下载下来的ik压缩包解压缩至ik文件夹下,重启e   词库介绍ik分词器主......
  • Snap算法学习01-03Snap中的类及其定义
        //graph.h定义的基本类型无向图  ///Undirectedgraph.##TUNGraph::ClassclassTUNGraph 有向图///Directedgraph.##TNGraph::ClassclassTNGraph 二部图///Bipartitegraph.##Bipartite_graphclassTBPGraph 多重图///Directedmultigr......
  • 自定义MultipleViewResolver
    1.MultipleViewResolver.javaimportjava.util.Locale;importjava.util.Map;importorg.springframework.web.servlet.View;importorg.springframework.web.servlet.ViewResolver;publicclassMultipleViewResolverimplementsViewResolver{privateMap<St......
  • 11.9 自定义异常
    demo在项目开发中,会大量接触自定义异常本节案例,综合本章节很多案例。classBombExceptionextendsException{//自定义强制处理异常 publicBombException(Stringmsg){ super(msg);//调用父类构造 }}classFood{ publicstaticvoideat(intnum)throwsBombE......
  • 将MembershipCreateStatus枚举成员翻译成自定义信息
    publicstaticclassAccountValidation{publicstaticstringErrorCodeToString(MembershipCreateStatuscreateStatus){switch(createStatus){caseMembershipCreateStatus.DuplicateUserName:......
  • 前端Vue自定义注册界面模版 手机号邮箱账号输入框 验证码输入框  包含手机号邮箱账号
    前端Vue自定义注册界面模版手机号邮箱账号输入框验证码输入框 包含手机号邮箱账号验证,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13306效果图如下:......
  • 在 Kubernetes(k8s) 上部署 Spring Boot 应用程序:应用程序使用环境变量中的错误端口属
    如果我使用此配置启动部署(即先启动服务,然后启动部署)则pod在启动期间会失败。在日志中,我可以找到以下消息:***************************APPLICATIONFAILEDTOSTART***************************Description:Bindingtotargetorg.springframework.boot.autoconfigu......