# Linux to PPC Darwin Cross Compiler

### From CGSecurity

## Linux to powerpc Darwin/OSX cross-compiler

This script is designed to be run as root.

    #!/bin/sh
    # This script builds and installs a gcc cross compiler from Linux
    # to darwin
    # Copyright Christophe GRENIER <grenier@cgsecurity.org>
    # Licence: GPL v2 or any later version
    # Version 2006/02/24
    root=`pwd`
    name=`basename $0`
    WGET=wget

    die () {
            echo >&2 "$1"
            exit 1
    }

    exists () {
            if [ ! -r "$1" ]; then
                    die "$1 does not exist"
            fi
    }

    usage () {
            die "usage: $name [clean]"
    }

    case "$#" in
    1)
            case "$1" in
            clean)
                    rm -rf build-binutils* build-gcc*
                    exit 0
            ;;
            *)
                    usage
            ;;
            esac
    ;;
    esac

    # You may want to change the installation prefix, which is where the
    # script will install the cross-compiler tools.
    prefix='/usr'
    gccVers='4.0.2'
    odcctoolsVers='20060123'
    GCCSOURCE="ftp://ftp.uvsq.fr/pub/gcc/releases/gcc-$gccVers"
    DARWINROOTS="http://darwinsource.opendarwin.org/Roots"
    CCTOOLSSOURCE="http://www.opendarwin.org/downloads/"

    target='powerpc-apple-darwin'
    configureGCCFlags="--with-as=/usr/bin/$target-as  --with-ld=/usr/bin/$target-ld --with-libtool=/usr/bin/$target-libtool"
    makeGCCFlags=''
    gccTarBz2="gcc-core-$gccVers.tar.bz2"
    gxxTarBz2="gcc-g++-$gccVers.tar.bz2"

    echo 'Checking that needed files exist.'
    for file in architecture-245.root.tar.gz Csu-57.root.tar.gz dyld-43.root.tar.gz gcc-4061.root.tar.gz gcc_os-1809.root.tar.gz gcc_select-46.root.tar.gz Libc-391.root.tar.gz Libc_headers-391.root.tar.gz Libc_static-391.root.tar.gz libdyld-43.root.tar.gz Libm-93.root.tar.gz Libmx-93.root.tar.gz Libsystem-88.root.tar.gz ncurses-8.1.root.tar.gz SystemStubs-5.root.tar.gz xnu-792.1.5.root.tar.gz
    do
    if [ ! -e $file ];
    then
      $WGET $DARWINROOTS/$file
      exists $file
    fi
    done

    #$gxxTarBz2
    for file in $gccTarBz2
    do
    if [ ! -e $file ];
    then
      $WGET $GCCSOURCE/$file
      exists $file
    fi
    done

    for file in odcctools-$odcctoolsVers.tar.bz2
    do
    if [ ! -e $file ];
    then
      $WGET $CCTOOLSSOURCE/$file
      exists $file
    fi
    done

    echo 'Creating the env'
    mkdir -p $prefix/$target || die "Cannot create $prefix/$target."
    ln -sf $prefix/$target $prefix/$target/usr
    ln -sf $prefix/$target $prefix/$target/local
    ln -sf $prefix/$target/lib/system/ /usr/lib/system
    for file in architecture-245.root.tar.gz Csu-57.root.tar.gz dyld-43.root.tar.gz gcc-4061.root.tar.gz gcc_os-1809.root.tar.gz gcc_select-46.root.tar.gz Libc-391.root.tar.gz Libc_headers-391.root.tar.gz Libc_static-391.root.tar.gz libdyld-43.root.tar.gz Libm-93.root.tar.gz Libmx-93.root.tar.gz Libsystem-88.root.tar.gz ncurses-8.1.root.tar.gz SystemStubs-5.root.tar.gz xnu-792.1.5.root.tar.gz
    do
      tar xzf $file -C $prefix/$target
    done

    echo 'Building odcctools.'
    if [ ! -d odcctools-$odcctoolsVers ];
    then
            tar xjf odcctools-$odcctoolsVers.tar.bz2
    fi
    cd odcctools-$odcctoolsVers
    eval    ./configure --target=$target --prefix=/usr 2>&1 | tee $root/configure-odcctools-$target.log || die "Configure of odcctools failed."
    # Remove ld64 as it doesn't compile
    perl -pi -e  "s,COMPONENTS = ar as include libstuff libmacho ld ld64 man misc otool,COMPONENTS = ar as include libstuff libmacho ld man misc otool,;" Makefile
    eval    make 2>&1 | tee $root/odcctools-$target.log || die "Build of odcctools failed."
    eval    make install 2>&1 | tee $root/odcctools-$target-install.log
    #|| die "Install of odcctools failed."

    echo 'Building gcc.'
    cd $root
    if [ ! -d gcc-$gccVers ];
    then
            tar xjf $gccTarBz2
    #       tar xjf $gxxTarBz2
    fi
    perl -pi -e  "s,/usr/bin/libtool,/usr/bin/$target-libtool,;" gcc-$gccVers/gcc/config/darwin.h
    mkdir -p build-gcc-$target
    cd build-gcc-$target
    #       --enable-languages=c,c++ \
    eval ../gcc-$gccVers/configure -v $configureGCCFlags \
            --enable-languages=c \
            --prefix=$prefix \
            --target=$target \
            --enable-static --enable-shared  \
            2>&1 | tee $root/configure-gcc-$target.log ||
            die "Configure of gcc failed."
    eval make $makeGCCFlags all install 2>&1 |tee $root/gcc-$target.log ||
            die "Build of gcc failed."
    echo 'Success.'

Once the cross-compiler is installed, you should be able to build a program using

    ./configure --host=powerpc-apple-darwin && make

##### Data Recovery

- TestDisk
- PhotoRec
- Download