博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C代码中如何使用链接脚本.lds中定义的变量
阅读量:2344 次
发布时间:2019-05-10

本文共 1099 字,大约阅读时间需要 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;

使用取址符号&去得到它在符号表中的值。

注意,这个值只是链接脚本中定义的值,并不表示某个变量的地址。

 

转载地址:http://ktnvb.baihongyu.com/

你可能感兴趣的文章
ios基础
查看>>
unity3d
查看>>
metronic 1.5
查看>>
unity3d 4 assert store
查看>>
tab bar control 注意事项
查看>>
sql优化部分总结
查看>>
IDEA运行时动态加载页面
查看>>
UML总结(对九种图的认识和如何使用Rational Rose 画图)
查看>>
js遍历输出map
查看>>
easeui分页
查看>>
20个非常有用的Java程序片段
查看>>
Enterprise Architect使用教程
查看>>
Enterprise Architect 生成项目类图
查看>>
浅入深出 MySQL 中事务的实现
查看>>
UML总结(对九种图的认识和如何使用Rational Rose 画图)
查看>>
Java中使用HttpRequest获取用户真实IP地址端口
查看>>
easyUI下拉列表点击事件的使用
查看>>
js遍历map
查看>>
单例模式
查看>>
JDBC连接数据库核心代码
查看>>