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