_ | | | | | | | |____ \_____/
## ## #### ## #### ## ##
#### ## ## ## ## ## ## ####
__ __ \ \ / / \ V / \ / | | \_/
_______ / ___ ) \/ ) | / ) / / / / / (_/\ (_______/
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. 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.