#!/bin/sh ## This file is part of the libpayload project. ## ## 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 # 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. # echo "CC = $CC" 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 . $BASE/../libpayload.config _LDSCRIPT="-Wl,-T,$_LIBDIR/libpayload.ldscript" trygccoption() { $DEFAULT_CC $1 -S -xc /dev/null -o /dev/null &> /dev/null return $? } DEBUGME=0 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 if [ "$CONFIG_ARCH_X86" = "y" ]; then _ARCHINCDIR=$_INCDIR/i386 _ARCHLIBDIR=$_LIBDIR/i386 fi if [ "$CONFIG_TARGET_POWERPC" = "y" ]; then _ARCHINCDIR=$_INCDIR/powerpc _ARCHLIBDIR=$_LIBDIR/powerpc fi _CFLAGS="-m32 -nostdinc -nostdlib -I$_INCDIR -I$_ARCHINCDIR -D__LIBPAYLOAD__=1" # Check for the -fno-stack-protector silliness trygccoption -fno-stack-protector [ $? -eq 0 ] && _CFLAGS="$_CFLAGS -fno-stack-protector" _CFLAGS="$_CFLAGS -I`$DEFAULT_CC -m32 -print-search-dirs | head -n 1 | cut -d' ' -f2`include" _LDFLAGS="-L$BASE/../lib $_LDSCRIPT -static" if [ $DOLINK -eq 0 ]; then if [ $DEBUGME -eq 1 ]; then echo "$DEFAULT_CC $_CFLAGS $CMDLINE" fi $DEFAULT_CC $_CFLAGS $CMDLINE else _LIBGCC=`$DEFAULT_CC -m32 -print-libgcc-file-name` if [ $DEBUGME -eq 1 ]; then echo "$DEFAULT_CC $_CFLAGS $_LDFLAGS $_ARCHLIBDIR/head.o $CMDLINE -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 $_CFLAGS $_LDFLAGS $_ARCHLIBDIR/head.o $CMDLINE -lpayload $_LIBGCC fi