本篇博客分析U-boot2018.11中重要的数据存储方式 linker list。
普通的双链表由C语言编译器最后编译到程序的数据段中,与程序的其他数据存放在一起。在U-boot中,定义了Linker list这种结构,linker list结构的数据存放特定的段中,不与程序的其他数据存放在一起。
背景知识
C语言的编译器和链接器一起将C语言源文件程序,编译链接成最终的目标程序。每个C源程序经编译器编译,生成Object中间文件,这个文件存放着源文件的text段,data段等,还存放C文件导出和导入的符号表。 链接器将多个源文件的text段和data段合并到目标文件的text段和data段。
自定义输出段
除了默认的text段存放指令,data段存放数据外,还可以告诉链接器生成我们自己定义的段。看下面的链接器脚本片段:
#include <config.h>
#include <asm/psci.h>
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
*(.__image_copy_start)
*(.vectors)
CPUDIR/start.o (.text*)
}
...
. = ALIGN(4);
.u_boot_list : {
KEEP(*(SORT(.u_boot_list*)));
}
...
}
通过上面的链接器脚本,我们告诉链接器将自定义一个段u_boot_list,将所有Object中间文件的所有u_boot_list段的内容,放入到该段中。
设置变量、函数的存放段
一般情况下编译C源文件,编译器会自动将变量或函数存放到适当的段中。当我们想将变量,函数放到特定的段中,如何告诉编译器这样做呢?
在