C代码中如何使用链接脚本.lds中定义的变量
原因:
一.
在C代码中,这样的语句:
1. 在代码中,留出4字节的空间,保存数值1000
2.在C语言的symbole talbe,即符号表中,有一个名为foo的项,它里面存有那4字节空间的地址。
我们执行 foo = 1时,会先去符号表中找到foo对应的地址,然后把数值1填到那个地址对应的内存;
我们执行 int *a = &foo时,会直接把符号表中foo的地址,写给a。
二.
在C语言中,符号表中会有一个名为__bss_start的项,这个项目中的值(地址值)是1000;
注意,这个1000并没有实际存在的内存。
三.
所以:在C语言中,要去使用链接脚本中定义的值时,应该这样做:
发布日期:2021-06-28 15:58:37
浏览次数:3
分类:技术文章
本文共 1098 字,大约阅读时间需要 3 分钟。
在链接脚本中,经常有这样的代码:
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_startldr 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;使用取址符号&去得到它在符号表中的值。
注意,这个值只是链接脚本中定义的值,并不表示某个变量的地址。
转载于:
转载地址:https://blog.csdn.net/xiaodingqq/article/details/79290320 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年04月04日 05时18分15秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Vue电商项目之放大镜插件的使用
2019-04-29
VUE进阶之使用vue-draggable拖拽
2019-04-29
微信小程序特训之父子组件传值
2019-04-29
解除端口占用 Address already in use::8000
2019-04-29
VUE之axios解决跨域方案
2019-04-29
nodeJS学习------拿到数据有RowDataPacket处理
2019-04-29
vue-cli3中引入less,scss等解决方案
2021-07-02
vue使用swiper插件修改左右箭头的默认样式
2021-07-02
微信小程序--拿到时间戳 转换 并绑定
2021-07-02
关于转换十位时间戳出现1970的问题
2019-04-29
【vue系列】在Vue项目中使用Sass-----(scss)安装详解,新手跟着做即可
2019-04-29
前端-给大家一个超级好用简单方便的图片压缩工具(网页在线)~
2019-04-29
前端html实现删除线的两种方法(下划线)css样式总结
2019-04-29
js根据ID获取输入框的值
2019-04-29
初学wx小程序在vscode上装什么插件
2019-04-29
(split盲点)javascript如何判断字符串中某个特定字符的个数
2019-04-29
axios请求头踩坑日记之-application/json
2019-04-29
vue-封装axios的GET请求
2019-04-29