大家好 我有个问题要请教你们
下面是我的链接脚本
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = VIRTUAL_ADDRESS;
__begin_kernel = .;
__begin_lmosem_hal_head_text = .;
.head.text ALIGN(4) : { *(.head.text) }
__end_lmosem_hal_head_text = .;
__begin_lmosem_hal_head_data = .;
.head.data ALIGN(4) : { *(.head.data) }
__end_lmosem_hal_head_data = .;
__begin_lmosem_hal_init = .;
.lmosem_hal.init ALIGN(4) : { *(.lmosem_hal.init) }
__end_lmosem_hal_init = .;
__begin_lmosem_hal_vector = .;
.lmosem_hal.vector ALIGN(4) : { *(.lmosem_hal.vector) }
__end_lmosem_hal_vector = .;
__begin_lmosem_hal_intvect = .;
.lmosem_hal.intvect ALIGN(4) : { *(.lmosem_hal.intvect) }
__end_lmosem_hal_intvect = .;
__begin_text = .;
.data ALIGN(4) : { *(.text) }
__end_text = .;
__begin_data = .;
.data ALIGN(4) :{ *(.data) }
__end_data = .;
__begin_rodata = .;
.rodata ALIGN(4) :{ *(.rodata) *(.rodata.*) }
__end_rodata = .;
__begin_kstrtab = .;
.kstrtab ALIGN(4) : { *(.kstrtab) }
__end_kstrtab = .;
__begin_bss = .;
.bss ALIGN(4) : { *(.bss) }
__end_bss = .;
__end_kernel = .;
}
然后我在C头文件中这样定义:
extern char __begin_kernel;
extern char __begin_lmosem_hal_head_text;
extern char __end_lmosem_hal_head_text;
extern char __begin_lmosem_hal_head_data;
extern char __end_lmosem_hal_head_data;
extern char __begin_lmosem_hal_init;
extern char __end_lmosem_hal_init;
extern char __begin_lmosem_hal_vector;
extern char __end_lmosem_hal_vector;
extern char __begin_lmosem_hal_intvect;
extern char __end_lmosem_hal_intvect;
extern char __begin_text;
extern char __end_text;
extern char __begin_data;
extern char __end_data;
extern char __begin_rodata;
extern char __end_rodata;
extern char __begin_kstrtab;
extern char __end_kstrtab;
extern char __begin_bss;
extern char __end_bss;
extern char __end_kernel;
然后我在C文件中这样引用
u32_t P=(u32_t)(&__end_lmosem_hal_vector);
实际上不管访问上面哪个变量的地址都是等于 0x30008000 也就是等于VIRTUAL_ADDRESS的值 这是为什么
P的值永远等于 0x30008000
arm-linux-ld -v
GNU ld (GNU Binutils) 2.20