lpgcc was too noisy in some cases
[coreboot.git] / payloads / libpayload / bin / lpgcc
index da8b48115532a15c93fea2d8e1a7cb494599abfe..57015d5f499a845318b14fdc23fb191d23e614fa 100755 (executable)
 ## 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
@@ -39,6 +52,11 @@ 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 .$$.tmp &> /dev/null
        RET=$?
@@ -73,6 +91,11 @@ while [ $# -gt 0 ]; do
                shift
                continue
                ;;
+           -Wl,-T,*)
+               _LDSCRIPT="$1"
+               shift
+               continue
+               ;;
            *)
                ;;
        esac
@@ -81,7 +104,17 @@ while [ $# -gt 0 ]; do
        shift
 done
 
-_CFLAGS="-m32 -nostdinc -nostdlib -I$_INCDIR"
+if [ "$CONFIG_TARGET_I386" = "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
 
@@ -90,7 +123,7 @@ trygccoption -fno-stack-protector
 
 _CFLAGS="$_CFLAGS -I`$DEFAULT_CC -m32 -print-search-dirs | head -n 1 | cut -d' ' -f2`include"
 
-_LDFLAGS="-Wl,-T,$_LIBDIR/libpayload.ldscript -static"
+_LDFLAGS="$_LDSCRIPT -static"
 
 if [ $DOLINK -eq 0 ]; then
     if [ $DEBUGME -eq 1 ]; then
@@ -101,8 +134,13 @@ if [ $DOLINK -eq 0 ]; then
 else
     _LIBGCC=`$DEFAULT_CC -m32 -print-libgcc-file-name`
     if [ $DEBUGME -eq 1 ]; then
-       echo "$DEFAULT_CC $_CFLAGS $_LDFLAGS $CMDLINE $_LIBDIR/i386/head.o $_LIBDIR/libpayload.a $_LIBGCC"
+       echo "$DEFAULT_CC $_CFLAGS $_LDFLAGS $_ARCHLIBDIR/head.o $CMDLINE $_LIBDIR/libpayload.a $_LIBGCC"
     fi
 
-    $DEFAULT_CC $_CFLAGS $_LDFLAGS $CMDLINE $_LIBDIR/i386/head.o $_LIBDIR/libpayload.a $_LIBGCC
+    # 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 $_LIBDIR/libpayload.a $_LIBGCC
 fi