here's my problem. I have this linker script that links a standard arm7nommu-uClinux kernel:
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) }
}
The memory architecture of my hw simulator is composed by one sdram and one flash memory. I want to split the section of my code and put (for example) the .text section in flash and the .data section in sdram at a particoular address. For that purpose i have modified my linker script this way:
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) }
}
It works fine because all sections are mapped where i want, but the output file is about 429Mb when the normal output file (linked with the previous linker script) is about 800Kb!... Why? Please help me!
Thanks in advance.
You told it too :-)
0x19910000 = 428933120 ~= 409 MB