LK call_constructors

lk/top/main.c
call_constructors:

static void call_constructors(void) {     void **ctor;

    ctor = &__ctor_list;     while (ctor != &__ctor_end) {         void (*func)(void);

        func = (void ( *)(void))*ctor;

        func();         ctor++;     } }

 

lk/arch/arm64/system-onesegment.ld :

OUTPUT_FORMAT("elf64-littleaarch64", "elf64-bigaarch64", "elf64-littleaarch64") OUTPUT_ARCH(aarch64)

ENTRY(_start) SECTIONS {     . = %KERNEL_BASE% + %KERNEL_LOAD_OFFSET%;

    /* text/read-only data */     /* set the load address to physical MEMBASE */     .text : AT(%MEMBASE% + %KERNEL_LOAD_OFFSET%) {         __code_start = .;         KEEP(*(.text.boot))         KEEP(*(.text.boot.vectab))         *(.text* .sram.text.glue_7* .gnu.linkonce.t.*)     }

    .interp : { *(.interp) }     .hash : { *(.hash) }     .dynsym : { *(.dynsym) }     .dynstr : { *(.dynstr) }     .rel.text : { *(.rel.text) *(.rel.gnu.linkonce.t*) }     .rela.text : { *(.rela.text) *(.rela.gnu.linkonce.t*) }     .rel.data : { *(.rel.data) *(.rel.gnu.linkonce.d*) }     .rela.data : { *(.rela.data) *(.rela.gnu.linkonce.d*) }     .rel.rodata : { *(.rel.rodata) *(.rel.gnu.linkonce.r*) }     .rela.rodata : { *(.rela.rodata) *(.rela.gnu.linkonce.r*) }     .rel.got : { *(.rel.got) }     .rela.got : { *(.rela.got) }     .rel.ctors : { *(.rel.ctors) }     .rela.ctors : { *(.rela.ctors) }     .rel.dtors : { *(.rel.dtors) }     .rela.dtors : { *(.rela.dtors) }     .rel.init : { *(.rel.init) }     .rela.init : { *(.rela.init) }     .rel.fini : { *(.rel.fini) }     .rela.fini : { *(.rela.fini) }     .rel.bss : { *(.rel.bss) }     .rela.bss : { *(.rela.bss) }     .rel.plt : { *(.rel.plt) }     .rela.plt : { *(.rela.plt) }     .init : { *(.init) } =0x9090     .plt : { *(.plt) }

    /* .ARM.exidx is sorted, so has to go in its own output section.  */     __exidx_start = .;     .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }     __exidx_end = .;

    .dummy_post_text : {      __code_end = .;     }

    .rodata : ALIGN(4096) {         __rodata_start = .;         __fault_handler_table_start = .;         KEEP(*(.rodata.fault_handler_table))         __fault_handler_table_end = .;         *(.rodata .rodata.* .gnu.linkonce.r.*)     }

    /*      * extra linker scripts tend to insert sections just after .rodata,      * so we want to make sure this symbol comes after anything inserted above,      * but not aligned to the next section necessarily.      */     .dummy_post_rodata : {         __rodata_end = .;     }

    .data : ALIGN(4096) {         /* writable data  */         __data_start_rom = .;         /* in one segment binaries, the rom data address is on top of the ram data address */         __data_start = .;         *(.data .data.* .gnu.linkonce.d.*)     }

    .ctors : ALIGN(8) {         __ctor_list = .;         KEEP(*(.ctors .init_array))         __ctor_end = .;     }     .dtors : ALIGN(8) {         __dtor_list = .;         KEEP(*(.dtors .fini_array))         __dtor_end = .;     }     .got : { *(.got.plt) *(.got) }     .dynamic : { *(.dynamic) }

    /*      * extra linker scripts tend to insert sections just after .data,      * so we want to make sure this symbol comes after anything inserted above,      * but not aligned to the next section necessarily.      */     .dummy_post_data : {         __data_end = .;     }

    /* unintialized data (in same segment as writable data) */     .bss : ALIGN(4096) {         __bss_start = .;         KEEP(*(.bss.prebss.*))         . = ALIGN(8);         __post_prebss_bss_start = .;         *(.bss .bss.*)         *(.gnu.linkonce.b.*)         *(COMMON)         . = ALIGN(8);         __bss_end = .;     }

    /* Align the end to ensure anything after the kernel ends up on its own pages */     . = ALIGN(4096);     _end = .;

    . = %KERNEL_BASE% + %MEMSIZE%;     _end_of_ram = .;

    /* Strip unnecessary stuff */     /DISCARD/ : { *(.comment .note .eh_frame) } }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值