#!/bin/sh ## ## Copyright (C) 2008 Advanced Micro Devices, Inc. ## ## Redistribution and use in source and binary forms, with or without ## modification, are permitted provided that the following conditions ## are met: ## 1. Redistributions of source code must retain the above copyright ## notice, this list of conditions and the following disclaimer. ## 2. 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. ## 3. 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. # GCC wrapper for libpayload if [ "${V}" = "1" ]; then DEBUGME=1 else DEBUGME=0 fi if [ $DEBUGME -eq 1 ]; then echo "CC = $CC" fi # let's not recurse. # This is a hack, I know, but it makes sure that really simple user errors # don't fork-bomb your machine. if [ -n "$CC" ]; then b=`basename "$CC"` if [ "$b" = "lpgcc" ]; then CC="" fi fi if [ "$CC" != "" ]; then DEFAULT_CC=$CC else DEFAULT_CC=gcc fi BASE=`dirname $0` # This will set the _LIBDIR and _INCDIR variables used below . $BASE/lp.functions # include libpayload config if [ -f $BASE/../libpayload.config ]; then . $BASE/../libpayload.config elif [ -f $BASE/../.config ]; then . $BASE/../.config else echo "Can't find config" exit 1 fi if [ "$CONFIG_LP_ARCH_ARM" = "y" ]; then _ARCHINCDIR=$_INCDIR/arm _ARCHLIBDIR=$_LIBDIR/arm _ARCHEXTRA="" _ARCH=arm fi if [ "$CONFIG_LP_ARCH_ARM64" = "y" ]; then _ARCHINCDIR=$_INCDIR/arm64 _ARCHLIBDIR=$_LIBDIR/arm64 _ARCHEXTRA="" _ARCH=arm64 fi if [ "$CONFIG_LP_ARCH_X86" = "y" ]; then _ARCHINCDIR=$_INCDIR/x86 _ARCHLIBDIR=$_LIBDIR/x86 _ARCHEXTRA="-m32 " _ARCH=x86 fi if [ -f $_LIBDIR/libpayload.ldscript ]; then _LDDIR=$_LIBDIR elif [ -f $BASE/../arch/$_ARCH/libpayload.ldscript ]; then _LDDIR=$BASE/../arch/$_ARCH fi _LDSCRIPT="-Wl,-T,$_LDDIR/libpayload.ldscript" trygccoption() { $DEFAULT_CC $1 -S -xc /dev/null -o /dev/null &> /dev/null return $? } DOLINK=1 # This variable will contain the command line that the user wants to # pass to gas CMDLINE= # Process various flags that would change our behavior while [ $# -gt 0 ]; do case $1 in -m32|-fno-stack-protector) shift continue ;; -m64) error "Invalid option --64 - only 32 bit architectures are supported" ;; -c) DOLINK=0 ;; -debug-wrapper) DEBUGME=1 shift continue ;; -Wl,-T,*) _LDSCRIPT="$1" shift continue ;; *) ;; esac CMDLINE="$CMDLINE $1" shift done _CFLAGS="$_ARCHEXTRA -nostdinc -nostdlib -I$BASE/../build -I$_INCDIR -I$_ARCHINCDIR -D__LIBPAYLOAD__=1" if [ "$CONFIG_LP_PDCURSES" = y ]; then _CFLAGS="$_CFLAGS -I$BASE/../curses/PDCurses" fi if [ "$CONFIG_LP_TINYCURSES" = y ]; then _CFLAGS="$_CFLAGS -I$BASE/../curses" fi # Check for the -fno-stack-protector silliness trygccoption -fno-stack-protector [ $? -eq 0 ] && _CFLAGS="$_CFLAGS -fno-stack-protector" _CFLAGS="$_CFLAGS -include $BASE/../include/kconfig.h -I`$DEFAULT_CC $_ARCHEXTRA -print-search-dirs | head -n 1 | cut -d' ' -f2`include" _LDFLAGS="-L$BASE/../lib -L$_LIBDIR $_LDSCRIPT -static" if [ $DOLINK -eq 0 ]; then if [ $DEBUGME -eq 1 ]; then echo "$DEFAULT_CC $CMDLINE $_CFLAGS" fi $DEFAULT_CC $CMDLINE $_CFLAGS else _LIBGCC=`$DEFAULT_CC $_ARCHEXTRA -print-libgcc-file-name` if [ -f $_ARCHLIBDIR/head.o ]; then HEAD_O=$_ARCHLIBDIR/head.o elif [ -f $BASE/../build/head.o ]; then HEAD_O=$BASE/../build/head.o else echo "Could not find head.o" exit 1 fi if grep -q ARM64_A53_ERRATUM_843419=y $BASE/../libpayload.config && grep -q fix-cortex-a53-843419 $BASE/../libpayload.xcompile; then _LDFLAGS="$_LDFLAGS -Wl,--fix-cortex-a53-843419" fi _LDFLAGS="$_LDFLAGS -Wl,--defsym=CONFIG_LP_BASE_ADDRESS=$CONFIG_LP_BASE_ADDRESS" _LDFLAGS="$_LDFLAGS -Wl,--defsym=CONFIG_LP_HEAP_SIZE=$CONFIG_LP_HEAP_SIZE" _LDFLAGS="$_LDFLAGS -Wl,--defsym=CONFIG_LP_STACK_SIZE=$CONFIG_LP_STACK_SIZE" if [ $DEBUGME -eq 1 ]; then echo "$DEFAULT_CC $_LDFLAGS $HEAD_O $CMDLINE $_CFLAGS -lpayload $_LIBGCC" fi # Note: $_ARCHLIBDIR/head.o must be the first object being linked, because it # contains a Multiboot header. The Multiboot standard requires this # header to be placed below 0x2000 in the resulting image. See: # http://www.gnu.org/software/grub/manual/multiboot/html_node/OS-image-format.html $DEFAULT_CC $_LDFLAGS $HEAD_O $CMDLINE $_CFLAGS -lpayload $_LIBGCC fi