gnu链接器脚本符号值被重新分配

时间:2015-06-21 17:19:13

标签: c gcc ld linker-scripts

我使用链接描述文件来描述我的内核的内存映射。在链接器脚本中,我定义了许多符号来记录段开始/结束的位置。链接描述文件如下:

Controller.java

但如果我打印出这些符号的地址,OUTPUT_FORMAT(binary) SECTIONS { /DISCARD/ : { *(.comment) *(.note.GNU-stack) *(.eh_frame) } . = 0x100000; kernel_load_addr = .; .text : { kernel_text_start = .; *(.boot) *(.text*) kernel_text_end = .; } = 0x90 .data : { kernel_data_start = .; *(.rodata*) *(.data*) kernel_data_end = .; } = 0 .bss : { kernel_bss_start = .; *(COMMON) *(.bss) kernel_bss_end = .; } = 0 kernel_end = .; } 符号将与*_start符号相同。

我使用以下代码打印其值:

*_end

,结果是

enter image description here

地图文件是:

extern char kernel_text_start;
extern char kernel_text_end;
extern char kernel_data_start;
extern char kernel_data_end;
extern char kernel_bss_start;
extern char kernel_bss_end;
...
raw_write(u64_to_str((uint64_t) &kernel_text_start, buf, 16), 0x0f, 0);
raw_write(u64_to_str((uint64_t) &kernel_text_end, buf, 16), 0x0f, 40);
raw_write(u64_to_str((uint64_t) &kernel_data_start, buf, 16), 0x0f, 80);
raw_write(u64_to_str((uint64_t) &kernel_data_end, buf, 16), 0x0f, 120);
raw_write(u64_to_str((uint64_t) &kernel_bss_start, buf, 16), 0x0f, 160);
raw_write(u64_to_str((uint64_t) &kernel_bss_end, buf, 16), 0x0f, 200);

您可以看到这些符号的值已重新分配。

那么我怎样才能避免这种情况并在我的程序中获得正确的地址?

0 个答案:

没有答案