前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C代码中如何使用链接脚本中定义的变量?

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

作者头像
韦东山
发布2020-09-30 11:30:41
3.9K0
发布2020-09-30 11:30:41
举报
文章被收录于专栏:韦东山嵌入式韦东山嵌入式

参考文章:

https://sourceware.org/ml/binutils/2007-07/msg00154.html

作者:韦东山

原文出处:

http://bbs.100ask.org/forum.php?mod=viewthread&tid=16231

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

代码语言:javascript
复制
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,比如:

代码语言:javascript
复制
ldr r0, =__bss_start
ldr r1, =_end

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

代码语言:javascript
复制
void clean_bss(void)
{
extern int __bss_start, _end;
int *p = &__bss_start;
   
for (; p < &_end; p++)
        *p = 0;
}

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

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

代码语言:javascript
复制
int foo = 1000;

会导致2件事情发生:

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

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

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

二,在链接脚本中,假设

代码语言:javascript
复制
__bss_start = 1000

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

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

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

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

代码语言:javascript
复制
extern int __bss_start;
int val = &__bss_start;

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档