欢迎光临散文网 会员登陆 & 注册

13.6代码重定位_重定位_清除BSS段的C函数实现

2020-08-21 17:18 作者:韦东山  | 我要投稿

在前面,我们使用汇编程序来实现了重定位和清bss段,本节我们将使用C语言,实现重定位和清除bss段。

1.打开start.S把原来的汇编代码删除改为调用C函数 

改为 

2. 在init.c 实现如上两个C函数 

汇编中,为C语言传入的参数,依次就是R1、R2、R3。 编译,烧写运行没有问题。


我们假设不想汇编传入参数,而是C语言直接取参数。

1. 修改start.S 跳转到C函数不需要任何参数 

2. 修改链接脚本,让__code_start 等于当前地址,也就是这里的0x30000000 

3.修改init.c 用函数来获取参数 

编译烧写运行 ,没有问题。

总结: C函数怎么使用lds文件总的变量abc?

  1. 在C函数中声明改变量为extern外部变量类型,比如:extern int abc;

  2. 使用时,要取址,比如:int *p = &abc;//p的只即为lds文件中abc的值


汇编文件中可以直接使用外部链接脚本中的变量,但C函数中要加上取址符号。 解释一下原因: C函数中,定义一个全局变量int g_i;,程序中必然有4字节的空间留出来给这个变量g_i

假如我们的lds文件中有很多变量 lds{ a1 = ; a2 = ; a3 = ; ... } 如果我们C程序只用到几个变量,完全没必要全部存储lds里面的所有变量,C程序是不保存lds中的变量的。 对于万一要用到的变量,编译程序时,有一个symbol table符号表:

Chapter13 lesson6 001.jpg

如何使用symbol table符号表?

  1. 对于常规变量g_i,得到里面的值,使用&g_i得到addr;

  2. 为了保持代码的一致,对于lds中的a1,使用&a1得到里面的值;

这只是一个编译器的小技巧,不用深究。

结论:

  1. C程序中不保存lds文件中的变量,lds再大也不影响;

  2. 借助symbol table保存lds的变量,使用时加上"&"得到它的值,链接脚本的变量要在C程序中声明为外部变量,任何类型都可以;

13.6代码重定位_重定位_清除BSS段的C函数实现的评论 (共 条)

分享到微博请遵守国家法律