#! /bin/sh # # Copyright (C) 2007 Michal Kebrt # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # - The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # OBJCOPY="$1" LINK="_link.ld" HEADER="_components.h" shift 1 echo "OUTPUT_FORMAT(\"elf32-littlearm\") ENTRY(start) SECTIONS { .boot 0x0: AT (0) { *(BOOTSTRAP); *(.text); *(.rodata); *(.rodata.*); *(.data); /* initialized data */ *(.sdata); *(.sdata2); *(.sbss); *(.scommon); *(.bss); /* uninitialized static variables */ *(COMMON); /* global variables */ *(.reginfo); . = 0x4000; *(PT); /* page table placed at 0x4000 */" > "$LINK" echo ' /** @addtogroup arm32boot * @{ */ /** @file * @brief Components (kernel + tasks) related declarations. * * Generated by the pack script. This script packs all the * components (kernel + tasks) into one image (image.boot) and generates * a code that initializes an array of #component_t structs. */ #ifndef ___COMPONENTS_H__ #define ___COMPONENTS_H__ /** Holds information about components packed to one image (kernel + tasks). */ typedef struct { /** Name. */ char *name; /** Start address. */ void *start; /** End address. */ void *end; /** Size (in bytes). */ unsigned int size; } component_t; /** @} */ ' > "$HEADER" COUNT="0" DATA="" for TASK in "$@" ; do BASENAME="`basename "$TASK" | sed 's/^\(.*\)\.[^.]*$/\1/'`" OBJECT="${BASENAME}.o" SYMBOL="`echo "_binary_$TASK" | tr "./" "__"`" MACRO="`echo "$BASENAME" | tr [:lower:] [:upper:]`" echo "$TASK -> $OBJECT" echo " . = ALIGN(4096); *(.${BASENAME}_image);" >> "$LINK" echo " extern int ${SYMBOL}_start; extern int ${SYMBOL}_end; #define ${MACRO}_START ((void *) &${SYMBOL}_start) #define ${MACRO}_END ((void *) &${SYMBOL}_end) #define ${MACRO}_SIZE ((unsigned int) ${MACRO}_END - (unsigned int) ${MACRO}_START)" >> "$HEADER" "$OBJCOPY" -I binary -O elf32-littlearm -B arm --rename-section ".data=.${BASENAME}_image" "$TASK" "$OBJECT" DATA="${DATA} components[$COUNT].name = \"${BASENAME}\"; components[$COUNT].start = ${MACRO}_START; components[$COUNT].end = ${MACRO}_END; components[$COUNT].size = ${MACRO}_SIZE;"; COUNT="`expr "$COUNT" + 1`" done echo ' } }' >> "$LINK" echo " #define COMPONENTS $COUNT /** Initializes array of components. */ static void init_components(component_t components[]) { $DATA } #endif " >> "$HEADER"