链接脚本浪费了我的记忆 [英] linker script wastes my memory

查看:29
本文介绍了链接脚本浪费了我的记忆的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的问题.我有一个链接标准 arm7nommu-uClinux 内核的链接器脚本:

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) }
}

我的硬件模拟器的内存架构由一个 sdram 和一个闪存组成.我想拆分我的代码部分并将(例如).text 部分放在 flash 中,将 .data 部分放在 sdram 中的特定地址处.为此,我以这种方式修改了我的链接器脚本:

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) }
}

它工作正常,因为所有部分都映射到我想要的位置,但是当正常输出文件(与之前的链接描述文件链接)大约 800Kb 时,输出文件大约为 429Mb!...为什么?请帮帮我!

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!

提前致谢.

推荐答案

你也说了 :-)

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

0x19910000 = 428933120 ~= 409 MB

0x19910000 = 428933120 ~= 409 MB

这篇关于链接脚本浪费了我的记忆的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆