1OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") 2OUTPUT_ARCH(arm) 3 4ENTRY(_start) 5SECTIONS 6{ 7 . = %ROMBASE%; 8 __rom_start = .; 9 10 /* text/read-only data */ 11 .text : { 12 KEEP(*(.text.boot.secondstage)) 13 KEEP(*(.text.boot.vectab1)) 14 KEEP(*(.text.boot.vectab2)) 15 KEEP(*(.text.boot)) 16 *(.text* .sram.text.glue_7* .gnu.linkonce.t.*) 17 } 18 19 .interp : { *(.interp) } 20 .hash : { *(.hash) } 21 .dynsym : { *(.dynsym) } 22 .dynstr : { *(.dynstr) } 23 .rel.text : { *(.rel.text) *(.rel.gnu.linkonce.t*) } 24 .rela.text : { *(.rela.text) *(.rela.gnu.linkonce.t*) } 25 .rel.data : { *(.rel.data) *(.rel.gnu.linkonce.d*) } 26 .rela.data : { *(.rela.data) *(.rela.gnu.linkonce.d*) } 27 .rel.rodata : { *(.rel.rodata) *(.rel.gnu.linkonce.r*) } 28 .rela.rodata : { *(.rela.rodata) *(.rela.gnu.linkonce.r*) } 29 .rel.got : { *(.rel.got) } 30 .rela.got : { *(.rela.got) } 31 .rel.ctors : { *(.rel.ctors) } 32 .rela.ctors : { *(.rela.ctors) } 33 .rel.dtors : { *(.rel.dtors) } 34 .rela.dtors : { *(.rela.dtors) } 35 .rel.init : { *(.rel.init) } 36 .rela.init : { *(.rela.init) } 37 .rel.fini : { *(.rel.fini) } 38 .rela.fini : { *(.rela.fini) } 39 .rel.bss : { *(.rel.bss) } 40 .rela.bss : { *(.rela.bss) } 41 .rel.plt : { *(.rel.plt) } 42 .rela.plt : { *(.rela.plt) } 43 .init : { *(.init) } =0x9090 44 .plt : { *(.plt) } 45 46 /* .ARM.exidx is sorted, so has to go in its own output section. */ 47 __exidx_start = .; 48 .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } 49 __exidx_end = .; 50 51 .rodata : ALIGN(4) { 52 __rodata_start = .; 53 __fault_handler_table_start = .; 54 KEEP(*(.rodata.fault_handler_table)) 55 __fault_handler_table_end = .; 56 *(.rodata .rodata.* .gnu.linkonce.r.*) 57 } 58 59 /* fake section for .data to anchor off of 60 * needed because extra linker scripts tend to insert sections 61 * just after .rodata 62 */ 63 .dummy_post_rodata : { 64 /* end of rodata, start of data area */ 65 __rodata_end = . ; 66 __rom_end = . ; 67 __data_start_rom = .; 68 } 69 70 /* in two segment binaries, the data starts at the bottom of ram (MEMBASE) 71 * bump us forward to the start of ram 72 */ 73 . = %MEMBASE%; 74 75 /* start .data segment, force the physical address to be AT() __data_start_rom */ 76 .data : AT ( ADDR (.dummy_post_rodata) + SIZEOF (.dummy_post_rodata) ) ALIGN(4) { 77 __data_start = .; 78 *(.data .data.* .gnu.linkonce.d.*) 79 } 80 81 /* code that is located in ram */ 82 .sram.text : ALIGN(4) { 83 KEEP (*(.sram.text*)) 84 } 85 .ctors : ALIGN(4) { 86 __ctor_list = .; 87 KEEP(*(.ctors .init_array)) 88 __ctor_end = .; 89 } 90 .dtors : ALIGN(4) { 91 __dtor_list = .; 92 KEEP(*(.dtors .fini_array)) 93 __dtor_end = .; 94 } 95 .got : { *(.got.plt) *(.got) } 96 .dynamic : { *(.dynamic) } 97 98 /* 99 * extra linker scripts tend to insert sections just after .data, 100 * so we want to make sure this symbol comes after anything inserted above, 101 * but not aligned to the next section necessarily. 102 */ 103 .dummy_post_data : { 104 __data_end = .; 105 } 106 107 /* uninitialized data (in same segment as writable data) */ 108 .bss : ALIGN(4) { 109 KEEP(*(.bss.prebss.*)) 110 . = ALIGN(4); 111 __bss_start = .; 112 *(.bss .bss.*) 113 *(.gnu.linkonce.b.*) 114 *(COMMON) 115 . = ALIGN(4); 116 __bss_end = .; 117 } 118 119 _end = .; 120 121 . = %MEMBASE% + %MEMSIZE%; 122 _end_of_ram = .; 123 124 /* Strip unnecessary stuff */ 125 /DISCARD/ : { *(.comment .note .eh_frame) } 126} 127