Home | History | Annotate | Download | only in lkr
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /*
     18     These addresses are fake, but in a particular way that mesh with our expectations.
     19     - ".flash" will contain all parts of the app that go into actual flash
     20       *app header
     21       * code
     22       * RO data
     23       * initial contents of RW data
     24       * initial contents of the GOT
     25       * list of relocs
     26       * list of symbols
     27     - ".ram" will contain all data that uses ram (and is not part of the flash image)
     28       * RW data in its actua location
     29       * BSS
     30       * the GOT
     31     - ".trash" contains sections taht GCC simply feel like it MUST produce (link error otherwise) but we have no use for. it will be tripped
     32 
     33     After this image is produced a nonoapp_postprocess unitily will process relocs and symbols and compress them to a small reloc table
     34     while also modifying the app code itself potentially to adjust for new reloc format. This shrinks relocs a lot. GCC produces relocs at 8
     35     bytes per reloc and symbols at 16 bytes per symbol. We remove all symbol infos (as we do not need them) and compress the relevant data
     36     from there into relocs and app image itself, generating 4 bytes per reloc of "nano reloc data"
     37 
     38     Our format allows apps that are up to 256MB of flash and 256MB of ram in size.
     39 */
     40 
     41 MEMORY
     42 {
     43     flash   : ORIGIN = 0x10000000,  LENGTH = 256K /* we write this to flash */
     44     ram     : ORIGIN = 0x80000000,  LENGTH = 128K /* we allocate this in ram */
     45     trash   : ORIGIN = 0xF0000000,  LENGTH = 256K /* we throw this away soon after linking */
     46 }
     47 
     48 SECTIONS
     49 {
     50     .flash : {
     51         /***** start of struct BinHdr [see nanohub/nanohub.h] *****/
     52         /* binary format marker: 'NBIN' (LE) */
     53         LONG(0x4E49424E)
     54 
     55         /* version */
     56         KEEP(*(.app_version));
     57 
     58         /* things we need to load app */
     59         LONG(__data_start)
     60         LONG(__data_end)
     61         LONG(LOADADDR(.data))
     62 
     63         LONG(__bss_start)
     64         LONG(__bss_end)
     65 
     66         /* things we need to run it */
     67         LONG(__got_start)
     68         LONG(__got_end)
     69         LONG(__rel_start)
     70         LONG(__rel_end)
     71 
     72         KEEP(*(.app_init));
     73         /***** end of struct BinHdr [see nanohub/nanohub.h] *****/
     74 
     75         /* code */
     76         *(.text) *(.text.*) ;
     77         *(.rodata) *(.rodata.*) ;
     78         . = ALIGN(4);
     79     } > flash = 0xff
     80 
     81     .data : {
     82         . = ALIGN(4);
     83         __data_start = ABSOLUTE(.);
     84         __dso_handle = ABSOLUTE(__data_start);
     85         *(.data);
     86         *(.data.*);
     87         . = ALIGN(4);
     88         __data_end = ABSOLUTE(.);
     89 
     90         . = ALIGN(4);
     91         __init_array_start = ABSOLUTE(.);
     92         KEEP(*(SORT(.init_array.*)))
     93         KEEP(*(.init_array))
     94         __init_array_end = ABSOLUTE(.);
     95 
     96         . = ALIGN(4);
     97         __fini_array_start = ABSOLUTE(.);
     98         KEEP(*(SORT(.fini_array.*)))
     99         KEEP(*(.fini_array))
    100         __fini_array_end = ABSOLUTE(.);
    101         LONG(0) /* size in 32-bit words, to add to bss section for dynamic destructor registration */
    102 
    103         . = ALIGN(4);
    104         __got_start = ABSOLUTE(.);
    105         *(.got) *(.got.*) ;
    106         __got_end = ABSOLUTE(.);
    107 
    108     } > ram AT > flash
    109 
    110     .relocs : {
    111         . = ALIGN(4);
    112         /* relocs */
    113         __rel_start = ABSOLUTE(.);
    114         *(.rel) *(.rel.*) *(.rel.data.rel.local)
    115         __rel_end = ABSOLUTE(.);
    116         . = ALIGN(4);
    117 
    118     } > flash = 0xff
    119 
    120     .dynsym : {
    121         *(.dynsym); *(.dynsym.*);
    122     } > flash = 0xff
    123 
    124     .bss : {
    125         . = ALIGN(4);
    126         __bss_start = ABSOLUTE(.);
    127         *(.bss) *(.bss.*) *(COMMON);
    128         . = ALIGN(4);
    129         __bss_end = ABSOLUTE(.);
    130     } > ram
    131 
    132     __data_data = LOADADDR(.data);
    133 
    134     .dynstr : {
    135         *(.dynstr); *(.dynstr.*);
    136     } > trash
    137     .hash : {
    138         *(.hash); *(.hash.*);
    139     } > trash
    140     .dynamic : {
    141         *(.dynamic); *(.dynamic.*);
    142     } > trash
    143 }
    144