This repository has been archived by the owner on Feb 24, 2021. It is now read-only.
forked from Proxmark/proxmark3
-
-
Notifications
You must be signed in to change notification settings - Fork 117
/
Copy pathinstall-gnuarm4.sh
executable file
·277 lines (243 loc) · 9.51 KB
/
install-gnuarm4.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
#!/bin/bash
# Some things for you to configure
BINUTILS_VER="2.19.1a"
GCC_VER="4.3.3"
GDB_VER="6.8a"
NEWLIB_VER="1.17.0"
GMP_VER="4.2.4"
MPFR_VER="2.4.2"
INSIGHT_VER="6.8a"
# Where you want to install the tools
if [ "${1}" = "" ]; then
echo "Syntax: ${0} </installation/target/directory> [download & build directory (default ${PWD})]"
exit 1
else
DESTDIR="${1}"
fi
# Where do you want to build the tools. This is where the log files
# will be written (which you can monitor with 'tail' during compilation).
# You can delete this directory after everything is done.
if [ ! "${2}" = "" ]; then
SRCDIR="${2}"
else
SRCDIR="${PWD}"
fi
BUILDDIR=${SRCDIR}/build-gnuarm4
# Where to get each of the toolchain components
BINUTILS=http://ftp.gnu.org/gnu/binutils/binutils-${BINUTILS_VER}.tar.bz2
BINUTILS_TAR=binutils-${BINUTILS_VER}.tar.bz2
GCCCORE=http://ftp.gnu.org/gnu/gcc/gcc-${GCC_VER}/gcc-core-${GCC_VER}.tar.bz2
GCCCORE_TAR=gcc-core-${GCC_VER}.tar.bz2
GPP=http://ftp.gnu.org/gnu/gcc/gcc-${GCC_VER}/gcc-g++-${GCC_VER}.tar.bz2
GPP_TAR=gcc-g++-${GCC_VER}.tar.bz2
NEWLIB=ftp://sources.redhat.com/pub/newlib/newlib-${NEWLIB_VER}.tar.gz
NEWLIB_TAR=newlib-${NEWLIB_VER}.tar.gz
#INSIGHT=ftp://sourceware.org/pub/insight/releases/insight-${INSIGHT_VER}.tar.bz2
INSIGHT=http://mirrors.kernel.org/sources.redhat.com/insight/releases/insight-${INSIGHT_VER}.tar.bz2
INSIGHT_TAR=insight-${INSIGHT_VER}.tar.bz2
#INSIGHT=http://www.mirrorservice.org/sites/sources.redhat.com/pub/insight/releases/insight-${INSIGHT_VER}.tar.bz2
GDB=http://ftp.gnu.org/gnu/gdb/gdb-${GDB_VER}.tar.bz2
GDB_TAR=gdb-${GDB_VER}.tar.bz2
GMP=http://ftp.sunet.se/pub/gnu/gmp/gmp-${GMP_VER}.tar.bz2
GMP_TAR=gmp-${GMP_VER}.tar.bz2
MPFR=http://ftp.gnu.org/gnu/mpfr/mpfr-${MPFR_VER}.tar.bz2
MPFR_TAR=mpfr-${MPFR_VER}.tar.bz2
GNU_KEYRING_GPG=gnu-keyring.gpg
GNU_KEYRING=ftp://ftp.gnu.org/gnu/${GNU_KEYRING_GPG}
# Common configuration options (i.e., things to pass to 'configure')
COMMON_CFG="--enable-interwork --target=arm-eabi --program-prefix=arm-none-eabi- --prefix=${DESTDIR} --disable-werror --enable-languages=c,c++ --enable-multilib --disable-shared"
# Extra configuration options for each toolchain component
BINUTILS_CFG=
GCCCORE_CFG="--disable-nls --disable-threads --with-gcc --with-gnu-ld --with-gnu-as --with-dwarf2 --with-newlib --with-headers=${BUILDDIR}/newlib-${NEWLIB_VER}/newlib/libc/include --disable-libssp --disable-libstdcxx-pch --disable-libmudflap --disable-libgomp -v"
NEWLIB_CFG=
INSIGHT_CFG=
GDB_CFG=
# Make flags
MAKEFLAGS="-j 4"
# wget options
# -nv: non-verbose but not too quiet (still print errors/warnings)
# -nc: no-clobber, do not download a file that already exists
# -t 0: retry indefinitely
# -a wget.log: append errors/warnings to wget.log file
# -c continue
#WGET_OPTS="-nv -nc -t 0 -a wget.log"
WGET_OPTS="-c -t 0"
# Compiler flags for compiling Newlib (-O2 is already hard-coded)
NEWLIB_FLAGS="-march=armv4t -mcpu=arm7tdmi -g"
# GPG options to avoid polluting the user's keyring
GPG_OPTS="--keyring ${GNU_KEYRING_GPG} --no-default-keyring --homedir ."
############################################################################
# End of configuration section. You shouldn't have to modify anything below.
############################################################################
if [[ "$USER" != "root" ]]; then
echo "*** Warning! Not running as root!"
echo "Installation may fail if you do not have appropriate permissions!"
fi
mkdir -p ${BUILDDIR}
cd ${SRCDIR}
if [[ -f all.downloaded ]]; then
echo Looks like all downloads are complete, skipping downloads
else
wget ${WGET_OPTS} ${GNU_KEYRING}
# TODO: guess it's better to have a function that "downloads, checks file-presence and signature, and returns true/false" whether the file is ok
# Function will check if file exists (otherwise try to download the file - if failed and file still doesn't exist, complain and exit the script)
# Check if signature file exists (otherwise download the signature file as well - if download fail, warn the user and return function)
# Check the signature. If failed, backup-by-renaming current files, redownload both file & signature, run the function body one more time - if still no success, warn and return from function
function download_lib {
echo Now downloading $1
wget ${WGET_OPTS} $2
}
function download_signed_lib {
download_lib $1 $2
wget -N ${WGET_OPTS} $2.sig
gpg $GPG_OPTS --verify $3.sig 2> /dev/null
if [[ $? != 0 ]]; then
echo "Failed signature check for:" $3.sig
exit 1
fi
}
# NOTE: If new downloads are added here, please see the IMPORTANT note below
download_signed_lib BINUTILS ${BINUTILS} ${BINUTILS_TAR} || exit 1
download_signed_lib GCC ${GCCCORE} ${GCCCORE_TAR} || exit 1
download_signed_lib G++ ${GPP} ${GPP_TAR} || exit 1
download_lib NEWLIB ${NEWLIB}
# TODO: signature/hash check
download_lib INSIGHT ${INSIGHT}
# TODO: signature/hash check
download_signed_lib GDB ${GDB} ${GDB_TAR} || exit 1
download_signed_lib GMP ${GMP} ${GMP_TAR} || exit 1
download_signed_lib MPFR ${MPFR} ${MPFR_TAR} || exit 1
# IMPORTANT: Here is the number of .tar. archives downloaded above. Please update if new .tar. are added to download list.
if [[ `ls -1 *.tar.bz2 *.tar.gz | wc -l` != 8 ]]; then
echo "Seems like not all prerequisite files downloaded... Exiting."
exit 1
else
touch all.downloaded
fi
fi
cd ${BUILDDIR}
if [[ -f binutils.built ]]; then
echo Looks like BINUTILS was already built.
else
echo Building BINUTILS...
tar -xjf ../`basename ${BINUTILS}`
echo ___________________ > make.log
echo Building binutils... >> make.log
cd `find . -maxdepth 1 -type d -name 'binutils*'`
mkdir gnuarm
cd gnuarm
../configure ${COMMON_CFG} ${BINUTILS_CFG} >> ../../make.log 2>&1
make ${MAKEFLAGS} MAKEINFO=`which makeinfo` >> ../../make.log 2>&1
make install >> ../../make.log 2>&1
cd ../..
touch binutils.built
fi
echo ___________________ >> make.log
echo Adding ${DESTDIR}/bin to PATH >> make.log
export PATH; PATH=${DESTDIR}/bin:$PATH
echo ___________________ >> make.log
if [[ -f gcc.built ]]; then
echo Looks like GCC was already built.
else
echo Building GCC...
tar -xjf ../`basename ${GCCCORE}`
tar -xjf ../`basename ${GPP}`
tar -xjf ../`basename ${GMP}`
ln -s "${BUILDDIR}/gmp-${GMP_VER}" "${BUILDDIR}/gcc-${GCC_VER}/gmp"
tar -xjf ../`basename ${MPFR}`
ln -s "${BUILDDIR}/mpfr-${MPFR_VER}" "${BUILDDIR}/gcc-${GCC_VER}/mpfr"
tar -xzf ../`basename ${NEWLIB}`
echo ___________________ >> make.log
cat << EOF > gcc.patch
--- gcc-4.3.3.orig/gcc/config/arm/t-arm-elf
+++ gcc-4.3.3.mod/gcc/config/arm/t-arm-elf
@@ -33,8 +33,8 @@
# MULTILIB_DIRNAMES += fpu soft
# MULTILIB_EXCEPTIONS += *mthumb/*mhard-float*
#
-# MULTILIB_OPTIONS += mno-thumb-interwork/mthumb-interwork
-# MULTILIB_DIRNAMES += normal interwork
+MULTILIB_OPTIONS += mno-thumb-interwork/mthumb-interwork
+MULTILIB_DIRNAMES += normal interwork
#
# MULTILIB_OPTIONS += fno-leading-underscore/fleading-underscore
# MULTILIB_DIRNAMES += elf under
EOF
echo Patching GCC >> make.log
cd `find . -maxdepth 1 -type d -name 'gcc*'`
patch -p1 < ../gcc.patch
echo Building gcc... >> make.log
mkdir gnuarm
cd gnuarm
../configure ${COMMON_CFG} ${GCCCORE_CFG} >> ../../make.log 2>&1
make ${MAKEFLAGS} all-gcc >> ../../make.log 2>&1
make install >> ../../make.log 2>&1
cd ../..
touch gcc.built
fi
if [[ -f newlib.built ]]; then
echo Looks like NEWLIB was already built.
else
echo Building NEWLIB...
echo ___________________ >> make.log
echo Building newlib... >> make.log
cd `find . -maxdepth 1 -type d -name 'newlib*'`
mkdir gnuarm
cd gnuarm
../configure ${COMMON_CFG} ${NEWLIB_CFG} >> ../../make.log 2>&1
# This line adds our NEWLIB_CFLAGS to the configure.host file in the
# newlib subdirectory. This is the only way I could find to tell Newlib to
# compile itself with the -mmarch=armv4t and -mcpu=arm7tdmi flags.
# sed -i "/^newlib_cflags=/s/=.*\$/=\"${NEWLIB_FLAGS}\"/" ../newlib/configure.host
make ${MAKEFLAGS} >> ../../make.log 2>&1
make install >> ../../make.log 2>&1
cd ../..
touch newlib.built
fi
echo ___________________ >> make.log
echo "Now that newlib is built, second pass for GCC..." >> make.log
cd `find . -maxdepth 1 -type d -name 'gcc*'`
cd gnuarm
make ${MAKEFLAGS} >> ../../make.log 2>&1
make install >> ../../make.log 2>&1
cd ../..
if [[ -f insight.built ]]; then
echo Looks like INSIGHT was already built.
else
echo Building INSIGHT...
tar -xjf ../`basename ${INSIGHT}`
echo ___________________ >> make.log
echo Building insight... >> make.log
cd `find . -maxdepth 1 -type d -name 'insight*'`
mkdir gnuarm
cd gnuarm
../configure ${COMMON_CFG} ${INSIGHT_CFG} >> ../../make.log 2>&1
make ${MAKEFLAGS} >> ../../make.log 2>&1
make install >> ../../make.log 2>&1
cd ../..
touch insight.built
fi
if [[ -f gdb.built ]]; then
echo Looks like GDB was already built.
else
echo Building GDB...
tar -xjf ../`basename ${GDB}`
echo ___________________ >> make.log
echo Building insight... >> make.log
cd `find . -maxdepth 1 -type d -name 'gdb*'`
mkdir gnuarm
cd gnuarm
../configure ${COMMON_CFG} ${GDB_CFG} >> ../../make.log 2>&1
make ${MAKEFLAGS} >> ../../make.log 2>&1
make install >> ../../make.log 2>&1
cd ../..
touch gdb.built
fi
echo ___________________ >> make.log
echo Build complete. >> make.log
cd ${DESTDIR}
chmod -R a+rX .
echo Downloaded archives are in ${SRCDIR}
echo build driectory: ${BUILDDIR}
echo set environment variable ARMLIB to ${DESTDIR}/lib/gcc/arm-eabi/4.3.3/interwork for Makefile.linux
exit 0