arch/arm/lib/sections.c:
/*
这两个符号在一个C文件中声明,因此链接器使用R_ARM_RELATIVE重定位,而不是在链接器文件中定义符号时
使用的R_ARM_ABS32。仅使用R_ARM_RELATIVE重新定位可确保对符号的引用在重新定位之后和之前都是正确
的。
对于这些符号,我们需要一个0字节大小的类型,而编译器不允许定义C类型的对象“void”。编译器允许使用空
结构,但这会导致gcc 4.4及以下版本出现别名问题。因此,我们使用下一个最好的东西:零大小的数组,它既
是0字节大小的,又不受别名警告的影响。
*/
char __bss_start[0] __attribute__((section(".__bss_start")));
char __bss_end[0] __attribute__((section(".__bss_end")));
char __image_copy_start[0] __attribute__((section(".__image_copy_start")));
char __image_copy_end[0] __attribute__((section(".__image_copy_end")));
char __rel_dyn_start[0] __attribute__((section(".__rel_dyn_start")));
char __rel_dyn_end[0] __attribute__((section(".__rel_dyn_end")));
char __secure_start[0] __attribute__((section(".__secure_start")));
char __secure_end[0] __attribute__((section(".__secure_end")));
char __secure_stack_start[0] __attribute__((section(".__secure_stack_start")));
char __secure_stack_end[0] __attribute__((section(".__secure_stack_end")));
char __efi_runtime_start[0] __attribute__((section(".__efi_runtime_start")));
char __efi_runtime_stop[0] __attribute__((section(".__efi_runtime_stop")));
char __efi_runtime_rel_start[0] __attribute__((section(".__efi_runtime_rel_start")));
char __efi_runtime_rel_stop[0] __attribute__((section(".__efi_runtime_rel_stop")));
char _end[0] __attribute__((section(".__end")));