From OSDev Wiki
Jump to: navigation, search

This page is under construction! This page is a work in progress and may thus be incomplete. Its content may be changed in the near future.

Developing on Mac OSX is a pretty hard thing. Apple's toolchain is broken and will not create ELF executables, only MACH-O. This is problematic, so here I will list my experiences on trying to fix it or port stuff to OSX.


What this is NOT

This is NOT a roadmap on how to develop on OSX, but a list of experiences I had, and hint's and notes that might help you with OS Development. Feel free to contribute.



Clang is pretty easy to port. And I mean a full clang, not just the apple version. The apple version of clang appears to be able to only output Mach-O binaries, and ignores any options to create ELF output, or cross compile. However, building a full version of clang is pretty easy. You require Subversion and cmake. Apple make and binutils work well enough to produce a working binary. Just follow the tutorial on compiling clang.


Building an updated version of libiconv was easy. Here's my process:

function grab () {
    echo "Pulling $1..."
    if [ ! -f "$3" ]; then
        wget "$2/$3"
        echo "Already have $1"
} #Credit Kevin Lange (klange) for grab function


# Or
# MAKE='make -j 4' # to compile using four cores
brew-path() { brew info $1 | head -n3 | tail -n1 | cut -d' ' -f1; }
# Prerequisites
brew install gmp
brew install mpfr
brew install libmpc
# Download & install the latest GCC
mkdir -p /usr/gcc-4.7.0
mkdir temp-gcc
cd temp-gcc
tar xfz gcc-4.7.0.tar.gz
rm gcc-4.7.0.tar.gz
cd gcc-4.7.0
mkdir build
cd build
../configure \
   --prefix=/usr/gcc-4.7.0 \
   --with-gmp=$(brew-path gmp) \
   --with-mpfr=$(brew-path mpfr) \
   --with-mpc=$(brew-path libmpc) \
   --program-suffix=-4.7.0 \
   --enable-languages=c,c++ \
   --with-system-zlib \
   --enable-stage1-checking \
   --enable-plugin \
   --enable-lto \
sudo make -j 4 bootstrap
sudo make -j 4 install

binutils (cross compiling)

Porting binutils was A HUGE PAIN. First of all, you need to compile a working GCC. Then, you need to run the following commands.

export PREFIX=/usr/local/cross
export TARGET=i586-elf
export MAKEFLAGS="-j 4"
export CC=/usr/gcc-4.7.0/bin/gcc-4.7.0
export CXX=/usr/gcc-4.7.0/bin/g++-4.7.0
export CPP=/usr/gcc-4.7.0/bin/cpp-4.7.0
export LD=/usr/gcc-4.7.0/bin/gcc-4.7.0
mkdir -p ~/src/build-binutils/
curl | tar -x -f - -C ~/src/
cd ~/src/build-binutils/
../binutils-2.22/configure --prefix=$PREFIX --target=$TARGET --disable-nls

Now STOP. There is a bug in gcc that makes -Werror turn on for each component, and yet it wont be disabled by NO_WERROR. Enter build-binutils, and in each subfolder do a search for -Werror inside of Makefile, and delete it from CFLAGS. Then, finally you can:

make all
sudo make install

To install binutils to /usr/local/cross

Personal tools