linker script wastes my memory

2019-07-09 02:57发布

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.

1条回答
祖国的老花朵
2楼-- · 2019-07-09 03:27

You told it too :-)

.text  0x19910000 : {           /* Real text segment        */

0x19910000 = 428933120 ~= 409 MB

查看更多
登录 后发表回答