144 lines
4.3 KiB
Plaintext
144 lines
4.3 KiB
Plaintext
|
/*
|
||
|
* Copyright (C) 2016 The Android Open Source Project
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
These addresses are fake, but in a particular way that mesh with our expectations.
|
||
|
- ".flash" will contain all parts of the app that go into actual flash
|
||
|
*app header
|
||
|
* code
|
||
|
* RO data
|
||
|
* initial contents of RW data
|
||
|
* initial contents of the GOT
|
||
|
* list of relocs
|
||
|
* list of symbols
|
||
|
- ".ram" will contain all data that uses ram (and is not part of the flash image)
|
||
|
* RW data in its actua location
|
||
|
* BSS
|
||
|
* the GOT
|
||
|
- ".trash" contains sections taht GCC simply feel like it MUST produce (link error otherwise) but we have no use for. it will be tripped
|
||
|
|
||
|
After this image is produced a nonoapp_postprocess unitily will process relocs and symbols and compress them to a small reloc table
|
||
|
while also modifying the app code itself potentially to adjust for new reloc format. This shrinks relocs a lot. GCC produces relocs at 8
|
||
|
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
|
||
|
from there into relocs and app image itself, generating 4 bytes per reloc of "nano reloc data"
|
||
|
|
||
|
Our format allows apps that are up to 256MB of flash and 256MB of ram in size.
|
||
|
*/
|
||
|
|
||
|
MEMORY
|
||
|
{
|
||
|
flash : ORIGIN = 0x10000000, LENGTH = 256K /* we write this to flash */
|
||
|
ram : ORIGIN = 0x80000000, LENGTH = 128K /* we allocate this in ram */
|
||
|
trash : ORIGIN = 0xF0000000, LENGTH = 256K /* we throw this away soon after linking */
|
||
|
}
|
||
|
|
||
|
SECTIONS
|
||
|
{
|
||
|
.flash : {
|
||
|
/***** start of struct BinHdr [see nanohub/nanohub.h] *****/
|
||
|
/* binary format marker: 'NBIN' (LE) */
|
||
|
LONG(0x4E49424E)
|
||
|
|
||
|
/* version */
|
||
|
KEEP(*(.app_version));
|
||
|
|
||
|
/* things we need to load app */
|
||
|
LONG(__data_start)
|
||
|
LONG(__data_end)
|
||
|
LONG(LOADADDR(.data))
|
||
|
|
||
|
LONG(__bss_start)
|
||
|
LONG(__bss_end)
|
||
|
|
||
|
/* things we need to run it */
|
||
|
LONG(__got_start)
|
||
|
LONG(__got_end)
|
||
|
LONG(__rel_start)
|
||
|
LONG(__rel_end)
|
||
|
|
||
|
KEEP(*(.app_init));
|
||
|
/***** end of struct BinHdr [see nanohub/nanohub.h] *****/
|
||
|
|
||
|
/* code */
|
||
|
*(.text) *(.text.*) ;
|
||
|
*(.rodata) *(.rodata.*) ;
|
||
|
. = ALIGN(4);
|
||
|
} > flash = 0xff
|
||
|
|
||
|
.data : {
|
||
|
. = ALIGN(4);
|
||
|
__data_start = ABSOLUTE(.);
|
||
|
__dso_handle = ABSOLUTE(__data_start);
|
||
|
*(.data);
|
||
|
*(.data.*);
|
||
|
. = ALIGN(4);
|
||
|
__data_end = ABSOLUTE(.);
|
||
|
|
||
|
. = ALIGN(4);
|
||
|
__init_array_start = ABSOLUTE(.);
|
||
|
KEEP(*(SORT(.init_array.*)))
|
||
|
KEEP(*(.init_array))
|
||
|
__init_array_end = ABSOLUTE(.);
|
||
|
|
||
|
. = ALIGN(4);
|
||
|
__fini_array_start = ABSOLUTE(.);
|
||
|
KEEP(*(SORT(.fini_array.*)))
|
||
|
KEEP(*(.fini_array))
|
||
|
__fini_array_end = ABSOLUTE(.);
|
||
|
LONG(0) /* size in 32-bit words, to add to bss section for dynamic destructor registration */
|
||
|
|
||
|
. = ALIGN(4);
|
||
|
__got_start = ABSOLUTE(.);
|
||
|
*(.got) *(.got.*) ;
|
||
|
__got_end = ABSOLUTE(.);
|
||
|
|
||
|
} > ram AT > flash
|
||
|
|
||
|
.relocs : {
|
||
|
. = ALIGN(4);
|
||
|
/* relocs */
|
||
|
__rel_start = ABSOLUTE(.);
|
||
|
*(.rel) *(.rel.*) *(.rel.data.rel.local)
|
||
|
__rel_end = ABSOLUTE(.);
|
||
|
. = ALIGN(4);
|
||
|
|
||
|
} > flash = 0xff
|
||
|
|
||
|
.dynsym : {
|
||
|
*(.dynsym); *(.dynsym.*);
|
||
|
} > flash = 0xff
|
||
|
|
||
|
.bss : {
|
||
|
. = ALIGN(4);
|
||
|
__bss_start = ABSOLUTE(.);
|
||
|
*(.bss) *(.bss.*) *(COMMON);
|
||
|
. = ALIGN(4);
|
||
|
__bss_end = ABSOLUTE(.);
|
||
|
} > ram
|
||
|
|
||
|
__data_data = LOADADDR(.data);
|
||
|
|
||
|
.dynstr : {
|
||
|
*(.dynstr); *(.dynstr.*);
|
||
|
} > trash
|
||
|
.hash : {
|
||
|
*(.hash); *(.hash.*);
|
||
|
} > trash
|
||
|
.dynamic : {
|
||
|
*(.dynamic); *(.dynamic.*);
|
||
|
} > trash
|
||
|
}
|