Jordan Crouse | c3e728f | 2008-04-09 23:05:59 +0000 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | ## This file is part of the libpayload project. |
| 3 | ## |
| 4 | ## Copyright (C) 2008 Advanced Micro Devices, Inc. |
| 5 | ## |
| 6 | ## Redistribution and use in source and binary forms, with or without |
| 7 | ## modification, are permitted provided that the following conditions |
| 8 | ## are met: |
| 9 | ## 1. Redistributions of source code must retain the above copyright |
| 10 | ## notice, this list of conditions and the following disclaimer. |
| 11 | ## 2. Redistributions in binary form must reproduce the above copyright |
| 12 | ## notice, this list of conditions and the following disclaimer in the |
| 13 | ## documentation and/or other materials provided with the distribution. |
| 14 | ## 3. The name of the author may not be used to endorse or promote products |
| 15 | ## derived from this software without specific prior written permission. |
| 16 | ## |
| 17 | ## THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
| 18 | ## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 19 | ## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 20 | ## ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
| 21 | ## FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 22 | ## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| 23 | ## OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| 24 | ## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| 25 | ## LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| 26 | ## OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| 27 | ## SUCH DAMAGE. |
| 28 | |
| 29 | # GCC wrapper for libpayload |
Marc Jones | bb9490a | 2012-11-30 16:22:51 -0700 | [diff] [blame] | 30 | if [ -z "${V}" ] && [ "${V}" = 1 ]; then |
| 31 | DEBUGME=1 |
| 32 | else |
| 33 | DEBUGME=0 |
| 34 | fi |
| 35 | |
| 36 | if [ $DEBUGME -eq 1 ]; then |
| 37 | echo "CC = $CC" |
| 38 | fi |
| 39 | |
Stefan Reinauer | 14e2277 | 2010-04-27 06:56:47 +0000 | [diff] [blame] | 40 | # let's not recurse. |
Ronald G. Minnich | b575d67 | 2009-02-15 23:32:57 +0000 | [diff] [blame] | 41 | # This is a hack, I know, but it makes sure that really simple user errors |
Stefan Reinauer | 14e2277 | 2010-04-27 06:56:47 +0000 | [diff] [blame] | 42 | # don't fork-bomb your machine. |
Patrick Georgi | a4a022c | 2011-02-14 19:24:37 +0000 | [diff] [blame] | 43 | if [ -n "$CC" ]; then |
Marc Jones | bb9490a | 2012-11-30 16:22:51 -0700 | [diff] [blame] | 44 | b=`basename "$CC"` |
Ronald G. Minnich | b575d67 | 2009-02-15 23:32:57 +0000 | [diff] [blame] | 45 | if [ "$b" = "lpgcc" ]; then |
| 46 | CC="" |
| 47 | fi |
Patrick Georgi | a4a022c | 2011-02-14 19:24:37 +0000 | [diff] [blame] | 48 | fi |
Ronald G. Minnich | b575d67 | 2009-02-15 23:32:57 +0000 | [diff] [blame] | 49 | |
Stefan Reinauer | c359124 | 2008-08-07 15:22:01 +0000 | [diff] [blame] | 50 | if [ "$CC" != "" ]; then |
| 51 | DEFAULT_CC=$CC |
| 52 | else |
Jordan Crouse | c3e728f | 2008-04-09 23:05:59 +0000 | [diff] [blame] | 53 | DEFAULT_CC=gcc |
Stefan Reinauer | c359124 | 2008-08-07 15:22:01 +0000 | [diff] [blame] | 54 | fi |
Jordan Crouse | c3e728f | 2008-04-09 23:05:59 +0000 | [diff] [blame] | 55 | |
| 56 | BASE=`dirname $0` |
| 57 | |
| 58 | # This will set the _LIBDIR and _INCDIR variables used below |
| 59 | . $BASE/lp.functions |
| 60 | |
Stefan Reinauer | 5429e26 | 2009-05-26 18:01:53 +0000 | [diff] [blame] | 61 | # include libpayload config |
| 62 | . $BASE/../libpayload.config |
| 63 | |
Ulf Jordan | 6818a32 | 2009-02-10 21:12:35 +0000 | [diff] [blame] | 64 | _LDSCRIPT="-Wl,-T,$_LIBDIR/libpayload.ldscript" |
| 65 | |
Jordan Crouse | c3e728f | 2008-04-09 23:05:59 +0000 | [diff] [blame] | 66 | trygccoption() { |
Patrick Georgi | 82867d3 | 2012-09-26 15:26:05 +0200 | [diff] [blame] | 67 | $DEFAULT_CC $1 -S -xc /dev/null -o /dev/null &> /dev/null |
| 68 | return $? |
Jordan Crouse | c3e728f | 2008-04-09 23:05:59 +0000 | [diff] [blame] | 69 | } |
| 70 | |
Jordan Crouse | c3e728f | 2008-04-09 23:05:59 +0000 | [diff] [blame] | 71 | DOLINK=1 |
| 72 | |
| 73 | # This variable will contain the command line that the user wants to |
| 74 | # pass to gas |
| 75 | |
| 76 | CMDLINE= |
| 77 | |
| 78 | # Process various flags that would change our behavior |
| 79 | |
| 80 | while [ $# -gt 0 ]; do |
| 81 | case $1 in |
| 82 | -m32|-fno-stack-protector) |
| 83 | shift |
| 84 | continue |
| 85 | ;; |
| 86 | -m64) |
| 87 | error "Invalid option --64 - only 32 bit architectures are supported" |
| 88 | ;; |
| 89 | -c) |
| 90 | DOLINK=0 |
| 91 | ;; |
| 92 | -debug-wrapper) |
| 93 | DEBUGME=1 |
| 94 | shift |
| 95 | continue |
| 96 | ;; |
Ulf Jordan | 6818a32 | 2009-02-10 21:12:35 +0000 | [diff] [blame] | 97 | -Wl,-T,*) |
| 98 | _LDSCRIPT="$1" |
| 99 | shift |
| 100 | continue |
| 101 | ;; |
Jordan Crouse | c3e728f | 2008-04-09 23:05:59 +0000 | [diff] [blame] | 102 | *) |
| 103 | ;; |
| 104 | esac |
| 105 | |
| 106 | CMDLINE="$CMDLINE $1" |
| 107 | shift |
| 108 | done |
| 109 | |
Stefan Reinauer | 8af0d03 | 2012-12-14 13:05:21 -0800 | [diff] [blame] | 110 | if [ "$CONFIG_ARCH_ARMV7" = "y" ]; then |
| 111 | _ARCHINCDIR=$_INCDIR/armv7 |
| 112 | _ARCHLIBDIR=$_LIBDIR/armv7 |
Ronald G. Minnich | 1a29c1e | 2013-02-14 15:26:09 -0800 | [diff] [blame] | 113 | _ARCHEXTRA="" |
Stefan Reinauer | 8af0d03 | 2012-12-14 13:05:21 -0800 | [diff] [blame] | 114 | fi |
| 115 | |
| 116 | if [ "$CONFIG_ARCH_POWERPC" = "y" ]; then |
| 117 | _ARCHINCDIR=$_INCDIR/powerpc |
| 118 | _ARCHLIBDIR=$_LIBDIR/powerpc |
Ronald G. Minnich | 1a29c1e | 2013-02-14 15:26:09 -0800 | [diff] [blame] | 119 | _ARCHEXTRA="" |
Stefan Reinauer | 8af0d03 | 2012-12-14 13:05:21 -0800 | [diff] [blame] | 120 | fi |
| 121 | |
David Hendricks | 4b6be98 | 2012-11-30 13:56:31 -0800 | [diff] [blame] | 122 | if [ "$CONFIG_ARCH_X86" = "y" ]; then |
Stefan Reinauer | f6935a0 | 2012-12-14 11:42:57 -0800 | [diff] [blame] | 123 | _ARCHINCDIR=$_INCDIR/x86 |
| 124 | _ARCHLIBDIR=$_LIBDIR/x86 |
Ronald G. Minnich | 1a29c1e | 2013-02-14 15:26:09 -0800 | [diff] [blame] | 125 | _ARCHEXTRA="-m32 " |
Stefan Reinauer | 5429e26 | 2009-05-26 18:01:53 +0000 | [diff] [blame] | 126 | fi |
| 127 | |
Ronald G. Minnich | 1a29c1e | 2013-02-14 15:26:09 -0800 | [diff] [blame] | 128 | _CFLAGS="$_ARCHEXTRA -nostdinc -nostdlib -I$_INCDIR -I$_ARCHINCDIR -D__LIBPAYLOAD__=1" |
Jordan Crouse | c3e728f | 2008-04-09 23:05:59 +0000 | [diff] [blame] | 129 | |
| 130 | # Check for the -fno-stack-protector silliness |
| 131 | |
| 132 | trygccoption -fno-stack-protector |
| 133 | [ $? -eq 0 ] && _CFLAGS="$_CFLAGS -fno-stack-protector" |
| 134 | |
Ronald G. Minnich | 1a29c1e | 2013-02-14 15:26:09 -0800 | [diff] [blame] | 135 | _CFLAGS="$_CFLAGS -I`$DEFAULT_CC $_ARCHEXTRA -print-search-dirs | head -n 1 | cut -d' ' -f2`include" |
Jordan Crouse | c3e728f | 2008-04-09 23:05:59 +0000 | [diff] [blame] | 136 | |
Patrick Georgi | b1eab14 | 2011-03-01 07:12:08 +0000 | [diff] [blame] | 137 | _LDFLAGS="-L$BASE/../lib $_LDSCRIPT -static" |
Jordan Crouse | c3e728f | 2008-04-09 23:05:59 +0000 | [diff] [blame] | 138 | |
| 139 | if [ $DOLINK -eq 0 ]; then |
| 140 | if [ $DEBUGME -eq 1 ]; then |
| 141 | echo "$DEFAULT_CC $_CFLAGS $CMDLINE" |
| 142 | fi |
| 143 | |
| 144 | $DEFAULT_CC $_CFLAGS $CMDLINE |
| 145 | else |
Ronald G. Minnich | 1a29c1e | 2013-02-14 15:26:09 -0800 | [diff] [blame] | 146 | _LIBGCC=`$DEFAULT_CC $_ARCHEXTRA -print-libgcc-file-name` |
Jordan Crouse | c3e728f | 2008-04-09 23:05:59 +0000 | [diff] [blame] | 147 | if [ $DEBUGME -eq 1 ]; then |
Patrick Georgi | b1eab14 | 2011-03-01 07:12:08 +0000 | [diff] [blame] | 148 | echo "$DEFAULT_CC $_CFLAGS $_LDFLAGS $_ARCHLIBDIR/head.o $CMDLINE -lpayload $_LIBGCC" |
Jordan Crouse | c3e728f | 2008-04-09 23:05:59 +0000 | [diff] [blame] | 149 | fi |
| 150 | |
Stefan Reinauer | 7208f6e | 2010-03-25 18:54:43 +0000 | [diff] [blame] | 151 | # Note: $_ARCHLIBDIR/head.o must be the first object being linked, because it |
Robert Millan | 39ebf2f | 2008-11-11 23:36:12 +0000 | [diff] [blame] | 152 | # contains a Multiboot header. The Multiboot standard requires this |
| 153 | # header to be placed below 0x2000 in the resulting image. See: |
| 154 | # http://www.gnu.org/software/grub/manual/multiboot/html_node/OS-image-format.html |
| 155 | |
Patrick Georgi | b1eab14 | 2011-03-01 07:12:08 +0000 | [diff] [blame] | 156 | $DEFAULT_CC $_CFLAGS $_LDFLAGS $_ARCHLIBDIR/head.o $CMDLINE -lpayload $_LIBGCC |
Jordan Crouse | c3e728f | 2008-04-09 23:05:59 +0000 | [diff] [blame] | 157 | fi |