Linux kernel 链接器脚本浪费了我的内存
这是我的问题。 我有一个链接器脚本,它链接一个标准的arm7nommu uClinux内核:Linux kernel 链接器脚本浪费了我的内存,linux-kernel,arm,ld,linker-scripts,uclinux,Linux Kernel,Arm,Ld,Linker Scripts,Uclinux,这是我的问题。 我有一个链接器脚本,它链接一个标准的arm7nommu uClinux内核: OUTPUT_ARCH(arm) ENTRY(stext) SECTIONS { . = 0x0; .vectors : { *(.resetvector) } . = 0x8000; .init : { /* Init code and data */ _stext = .; __init_begin = .; *(.tex
OUTPUT_ARCH(arm)
ENTRY(stext)
SECTIONS
{
. = 0x0;
.vectors : {
*(.resetvector)
}
. = 0x8000;
.init : { /* Init code and data */
_stext = .;
__init_begin = .;
*(.text.init)
__proc_info_begin = .;
*(.proc.info)
__proc_info_end = .;
__arch_info_begin = .;
*(.arch.info)
__arch_info_end = .;
__tagtable_begin = .;
*(.taglist)
__tagtable_end = .;
*(.data.init)
. = ALIGN(16);
__setup_start = .;
*(.setup.init)
__setup_end = .;
__initcall_start = .;
*(.initcall.init)
__initcall_end = .;
. = ALIGN(4096);
__init_end = .;
}
/DISCARD/ : { /* Exit code and data */
*(.text.exit)
*(.data.exit)
*(.exitcall.exit)
}
.text : { /* Real text segment */
_text = .; /* Text and read-only data */
*(.text)
*(.fixup)
*(.gnu.warning)
*(.text.lock) /* out-of-line lock text */
*(.rodata)
*(.rodata.str1.4)
*(.glue_7)
*(.glue_7t)
*(.kstrtab)
. = ALIGN(16);
__start___ex_table = .; /* Exception table */
*(__ex_table)
__stop___ex_table = .;
__start___ksymtab = .; /* Kernel symbol table */
*(__ksymtab)
__stop___ksymtab = .;
__start___kallsyms = .; /* All kernel symbols */
*(__kallsyms)
__stop___kallsyms = .;
*(.got) /* Global offset table */
_etext = .; /* End of text section */
}
. = ALIGN(8192);
.data : {
__data_start = .;
/*
* first, the init task union, aligned
* to an 8192 byte boundary.
*/
*(.init.task)
/*
* then the cacheline aligned data
*/
. = ALIGN(32);
*(.data.cacheline_aligned)
/*
* and the usual data section
*/
*(.data)
CONSTRUCTORS
_edata = .;
}
.bss : {
__bss_start = .; /* BSS */
*(.bss)
*(COMMON)
. = ALIGN(0x10);
_end = . ;
_ebss = . ;
}
. = ALIGN(8192);
_end_kernel = . ;
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_info 0 : { *(.debug_info) }
.debug_line 0 : { *(.debug_line) }
.debug_pubnames 0 : { *(.debug_pubnames) }
.debug_aranges 0 : { *(.debug_aranges) }
}
硬件模拟器的内存结构由一个sdram和一个闪存组成。
我想拆分代码的部分,并将(例如)flash中的.text部分和sdram中的.data部分放在特定的地址。
为此,我以以下方式修改了链接器脚本:
OUTPUT_ARCH(arm)
ENTRY(stext)
MEMORY {
sdram : ORIGIN = 0x00000000, LENGTH = 12M
flash : ORIGIN = 0x19900000, LENGTH = 4M
}
SECTIONS
{
. = 0x0;
.vectors 0x19900000 : {
*(.resetvector)
} > flash
.init 0x19908000 : { /* Init code and data */
_stext = .;
__init_begin = .;
*(.text.init)
__proc_info_begin = .;
*(.proc.info)
__proc_info_end = .;
__arch_info_begin = .;
*(.arch.info)
__arch_info_end = .;
__tagtable_begin = .;
*(.taglist)
__tagtable_end = .;
*(.data.init)
. = ALIGN(16);
__setup_start = .;
*(.setup.init)
__setup_end = .;
__initcall_start = .;
*(.initcall.init)
__initcall_end = .;
. = ALIGN(4096);
__init_end = .;
} > flash
/DISCARD/ : { /* Exit code and data */
*(.text.exit)
*(.data.exit)
*(.exitcall.exit)
}
.text 0x19910000 : { /* Real text segment */
_text = .; /* Text and read-only data */
*(.text)
*(.fixup)
*(.gnu.warning)
*(.text.lock) /* out-of-line lock text */
*(.rodata)
*(.rodata.str1.4)
*(.glue_7)
*(.glue_7t)
*(.kstrtab)
. = ALIGN(16);
__start___ex_table = .; /* Exception table */
*(__ex_table)
__stop___ex_table = .;
__start___ksymtab = .; /* Kernel symbol table */
*(__ksymtab)
__stop___ksymtab = .;
__start___kallsyms = .; /* All kernel symbols */
*(__kallsyms)
__stop___kallsyms = .;
*(.got) /* Global offset table */
_etext = .; /* End of text section */
. = ALIGN(8192);
_end_kernel = . ;
} > flash
.data 0x100000 : {
. = ALIGN(8192);
__data_start = .;
/*
* first, the init task union, aligned
* to an 8192 byte boundary.
*/
*(.init.task)
/*
* then the cacheline aligned data
*/
. = ALIGN(32);
*(.data.cacheline_aligned)
/*
* and the usual data section
*/
*(.data)
CONSTRUCTORS
_edata = .;
} > sdram
.bss : {
__bss_start = .; /* BSS */
*(.bss)
*(COMMON)
. = ALIGN(0x10);
_end = . ;
_ebss = . ;
} > sdram
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_info 0 : { *(.debug_info) }
.debug_line 0 : { *(.debug_line) }
.debug_pubnames 0 : { *(.debug_pubnames) }
.debug_aranges 0 : { *(.debug_aranges) }
}
它工作得很好,因为所有部分都映射到我想要的位置,但是当正常输出文件(与以前的链接器脚本链接)大约为800Kb时,输出文件大约为429Mb!。。。为什么?
请帮帮我
提前谢谢 你也说过:-)
0x19910000=428933120~=409MBlol。。。在链接器脚本中使用内存标记可以解决内存浪费的问题。。。
.text 0x19910000 : { /* Real text segment */