_________ \__ __/ ) ( | | | | | | | | )_(
## ## ## ## ## ## ## ## ######
## ### ## ## ## ####
## ## ## ## ## ## #### ##
## ## ## # ## ####### ##### ## ##
IMPORTANT: enter the case-INsensitive alphabetic (no numbers) code AND WRITE SOME SHORT summary of changes (below) if you are saving changes. (not required for previewing changes). Wiki-spamming is not tolerated, will be removed, so it does NOT even show up in history. Spammers go away now. Visit Preferences to set your user name Summary of change: == Hardware Specific Compilation Information == Each hardware implementation has their own quirks for building: * CrossCompilation/GameBoyAdvance Information With different crt0/libraries, the same tool chain should also work for developing firmware for the VemsFrontier/ArmEfi boards. ---- == Building An ARM Cross-compiler Using The GNU Toolchain == In order to easily/quickly build binaries from C for the ARM processor, it's necessary to build a cross-compiler to run on a non-ARM machine (you can build natively if you've got the resources, but speaking as someone who has built all of XFree86 on a 200 MHz StrongARM, it sucks -- Alexander). Almost any desktop/workstation/server running Windos/Linux/*BSD/Mac OS X can host a cross-compiler, but it's a bit easier to get up and running under UNIX. [http://sourceforge.net/projects/devkitpro/ Devkitpro project] makes it a simpler process (tried with success on Linux and win32): * download devkitARM and libgba * cd /usr/local/arm-efi; unzip the downloaded tar.bz2 files: ** tar xjvf .... ** or bzip2 -d < .... | tar xvf - * export PATH=/usr/local/arm-efi/bin (set PATH=c:\pfiles\arm\bin on win32) * cd /tmp/gbatune; make While on linux you might be tempted to do the "compile yourself" method below, on win32 this is about your only choice to get going easily. All of the following was done under Linux (Debian/testing), but it can be easily applied to building the GNU toolchains on any other platform. === 1. Obtaining Source === Grab the following off of a GNU mirror of your choice (e.g. ftp.gnu.org): * binutils-2.13.2.1 (binutils-2.15 should work as well) * gcc-core-3.4.3 In order to get some semblance of libc support, you'll need to get newlib from sources.redhat.com: * newlib-1.13.0 Before we continue to build things, a couple assertions need to be made: * Our target name is 'arm-elf'. * Our installation prefix is going to be '/usr/local/arm-elf'. * We're going to configure/build our source separate from source. === 2. Setting Up The Source/Build Environment === Start by decompressing/extracting all of the source into one directory. Next, create empty build directories for each of the source packages: : \ <code> drwxr-xr-x 15 alexander alexander 4096 Dec 27 16:32 binutils-2.15 -rw-r--r-- 1 alexander alexander 15134701 Dec 27 16:15 binutils-2.15.tar.gz drwxr-xr-x 10 alexander alexander 4096 Dec 27 16:48 build.binutils drwxr-xr-x 7 alexander alexander 4096 Dec 27 17:01 build.gcc drwxr-xr-x 4 alexander alexander 4096 Dec 27 17:08 build.newlib drwxr-xr-x 11 alexander alexander 4096 Dec 27 17:00 gcc-3.4.3 -rw-r--r-- 1 alexander alexander 13040222 Dec 27 16:23 gcc-core-3.4.3.tar.bz2 drwxr-xr-x 9 alexander alexander 4096 Dec 17 15:03 newlib-1.13.0 -rw-r--r-- 1 alexander alexander 7786190 Dec 27 16:38 newlib-1.13.0.tar.gz </code> In order to not have to do the builds/installs as root, it's nice to make the base directory of the toolchain (i.e. /usr/local/arm-efi) a directory owned by your user. This avoids having to run configure scripts and make files as your super-user. After everything has been built/setup, you can change ownership over to whomever you feel is correct for your system (e.g. root). === 3. Configure/Build/Install binutils === Enter into your build.binutils directory, and execute the following: : \ <code> ../binutils-2.15/configure --target=arm-elf --prefix=/usr/local/arm-elf </code> Next, run ''make'', and then ''make install''. To make sure the rest of your builds can now see your new tools, add /usr/local/arm-elf/bin to your PATH. In a Bourne-a-like shell (e.g. sh, or bash), you do something like: : \ <code> PATH=$PATH:/usr/local/arm-elf/bin </code> === 4. Configure/Build/Install gcc === Inside build.gcc, execute the following: : \ <code> ../gcc-3.4.3/configure --target=arm-elf --with-cpu=arm7tdmi --with-newlib --enabl e-multilib --enable-interwork --disable-threads --enable-targets=arm-elf --enable-la nguages=c --prefix=/usr/local/arm-elf </code> Now ''make'' and ''make install''. === 5. Configure/Build/Install newlib === Inside build.newlib, execute the following: : \ <code> ../newlib-1.13.0/configure --target=arm-elf --prefix=/usr/local/arm-elf </code> Again, ''make'' and ''make install''. === 6. Test Out Your Creation === Open up your favorite editor, and edit a file called ''test.c'': : \ <code> int main(void) { return 0; } </code> Now compile/link this program with your new toolchain, and then verify the contents of the product: : \ <code> alexander@midget:/tmp$ arm-elf-gcc armtest.c -o armtest alexander@midget:/tmp$ arm-elf-objdump -f armtest armtest: file format elf32-littlearm architecture: arm, flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED start address 0x00008110 </code> Rejoice, your compiler/linker worked. Optional: Add document to category: Wiki formatting: * is Bullet list ** Bullet list subentry ... '''Bold''', ---- is horizontal ruler, <code> preformatted text... </code> See wiki editing HELP for tables and other formatting tips and tricks.