Skip to content

Native Compiler: Installation Instructions

Abhishek Thakur edited this page Jan 2, 2020 · 67 revisions

Native-Compiler ARM Toolchains Setup Guide

Note::bulb: These instructions are exclusively for GCC Cross Compiler version 9.2.0 but will work with any compiler version available with this project.

 

A. Prerequisites:

  • Update your environment:

    sudo apt update && sudo apt dist-upgrade
  • Install Important Packages(including default gcc):

    sudo apt-get install build-essential gawk gcc g++ gfortran git texinfo bison  wget bzip2 libncurses-dev libssl-dev openssl zlib1g-dev

 

B. Download Binary:

You can easily visit downloading page and find suitable cross-binaries for your Machine. Click Link given below:

 

C. Extracting and Linking Binary:

1. Temporary Installation: Use these binaries directly (Recommended)

This repository now provides Free-Standing Native-Compiler Toolchains that gives a common setup for everyone, the same standardized headers with no hardcoded paths, therefore the same solutions for everyone.

  • Extraction: Extract using tar terminal command as follows:

    tar xf <filename e.g native-gcc-9.2.0-pi_2-3.tar.gz>
  • Linking:

    • Setup paths as follows:
    PATH=/<extracted folder-name e.g native-pi-gcc-9.2.0-1>/bin:$PATH
    LD_LIBRARY_PATH=/<extracted folder-name e.g native-pi-gcc-9.2.0-1>/lib:$LD_LIBRARY_PATH
    • Setup Important Symlinks as follows:
     sudo ln -sf /usr/include/arm-linux-gnueabihf/asm /usr/include/asm
     sudo ln -sf /usr/include/arm-linux-gnueabihf/gnu /usr/include/gnu
     sudo ln -sf /usr/include/arm-linux-gnueabihf/bits /usr/include/bits
     sudo ln -sf /usr/include/arm-linux-gnueabihf/sys /usr/include/sys
     sudo ln -sf /usr/include/arm-linux-gnueabihf/openssl/* /usr/include/openssl
     sudo ln -sf /usr/lib/arm-linux-gnueabihf/crtn.o /usr/lib/crtn.o
     sudo ln -sf /usr/lib/arm-linux-gnueabihf/crt1.o /usr/lib/crt1.o
     sudo ln -sf /usr/lib/arm-linux-gnueabihf/crti.o /usr/lib/crti.o

 

2. Permanent Installation:

  • Extraction: Extract using tar terminal command as follows:

    tar xf <filename e.g native-gcc-9.2.0-pi_2-3.tar.gz>
  • Configuring: Move extracted folder to any location (for e.g. /opt) by using following command:

    sudo mv <extracted folder-name e.g native-pi-gcc-9.2.0-1> /opt
  • Linking: Properly link Path/Environment Variables permanently with either of the following given methods:

    • Appending variables to your .profile: (Recommended)

       echo 'export PATH=/opt/<extracted folder-name e.g native-pi-gcc-9.2.0-1>/bin:$PATH' >> .profile  
       echo 'export LD_LIBRARY_PATH=/opt/<extracted folder-name e.g native-pi-gcc-9.2.0-1>/lib:$LD_LIBRARY_PATH' >> .profile
       source .profile
    • Appending variables to your .bashrc: ⚠️ Some Linux users reported some trouble with configuring path variables at .profile that doesn't seem to work for them. If you encounter a similar problem, try setting/configure by adding paths to your .bashrc file instead of as follows:

       echo 'export PATH=/opt/<extracted folder-name e.g native-pi-gcc-9.2.0-1>/bin:$PATH' >> .bashrc
       echo 'export LD_LIBRARY_PATH=/opt/<extracted folder-name e.g native-pi-gcc-9.2.0-1>/lib:$LD_LIBRARY_PATH' >> .bashrc
       source .bashrc
  • Setup Important Symlinks as follows:

      sudo ln -sf /usr/include/arm-linux-gnueabihf/asm /usr/include/asm
      sudo ln -sf /usr/include/arm-linux-gnueabihf/gnu /usr/include/gnu
      sudo ln -sf /usr/include/arm-linux-gnueabihf/bits /usr/include/bits
      sudo ln -sf /usr/include/arm-linux-gnueabihf/sys /usr/include/sys
      sudo ln -sf /usr/include/arm-linux-gnueabihf/openssl/* /usr/include/openssl
      sudo ln -sf /usr/lib/arm-linux-gnueabihf/crtn.o /usr/lib/crtn.o
      sudo ln -sf /usr/lib/arm-linux-gnueabihf/crt1.o /usr/lib/crt1.o
      sudo ln -sf /usr/lib/arm-linux-gnueabihf/crti.o /usr/lib/crti.o

 

E. Bonus:

  • Extra Step to use these binaries(temporarily) as your default native GCC Compiler(instead of default GCC 6.3.0) at the time of compilation: (For more info. refer #16, thanks @krcroft)

    export AR="gcc-ar-9.2.0"
    export CC="gcc-9.2.0"
    export CXX="g++-9.2.0"
    export CPP="cpp-9.2.0"
    export FC="gfortran-9.2.0"
    export RANLIB="gcc-ranlib-9.2.0"
    export LD="$CXX"
  • Further, To enable Link-time-optimization (LTO):

    GCCPATH="/<extracted folder-name e.g native-pi-gcc-9.2.0-1>/libexec/gcc/arm-linux-gnueabihf/9.2.0"
    export ARFLAGS="--plugin $GCCPATH/liblto_plugin.so"
    export RANLIBFLAGS="--plugin $GCCPATH/liblto_plugin.so"

    NOTE: 💡 LTO also needs g++ to be the linker, and it can be enabled at compile-time by setting -flto=$(nproc) and -fno-fat-lto-objects flags in CFLAGS, CXXFLAGS, and LDFLAGS respectively.


Clone this wiki locally