libgcc: work around old Bionic loader bug

dl_iterate_phdr returns a 0 load_base for a PIE executable when it should
return the address where the executable was loaded (e.g. the load base or
load bias). Recalculate the load base when it is zero. This recalculation
should work on any ELF file with a PT_PHDR segment -- it will calculate 0
for a non-PIE executable.

The load base is added to an ELF virtual address to produce a run-time
address. Recalculate it by subtracting the PT_PHDR's virtual address from
its run-time address.

Bug: https://github.com/android-ndk/ndk/issues/505
Test: manual
Test: run NDK tests (./checkbuild.py && ./run_tests.py)
Change-Id: I7de46c07a8b04e794b59f07b4d554238cfd6d5d9
1 file changed
tree: 80affcdf249524cf1414767b8eb40f00ca8acd0b
  1. gcc-4.8.3/
  2. gcc-4.9/
  3. build-gcc.sh
  4. build.py
  5. compiler_wrapper
  6. OWNERS
  7. README.md
  8. README.version
  9. update-prebuilts.py
README.md

Building GCC for Android

The following process is used to build the GCC that is used by both the Android platfrom and the NDK.

Both Linux and Windows toolchains are built on Linux machines. Windows host binaries are built with mingw. Building binaries for Mac OS X should be built using 10.8 to ensure compatibility with Android's minimum supported hosts.

Prerequisites

  • Android GCC Repository

    • Check out the branch gcc

      repo init -u https://android.googlesource.com/platform/manifest -b gcc
      
      # Googlers, use
      repo init -u \
          persistent-https://android.git.corp.google.com/platform/manifest \
          -b gcc
      
  • Additional Linux Dependencies (available from apt):

    • texinfo
    • gcc-mingw32
    • bison
    • flex
    • libtool
  • Mac OS X also requires Xcode.

Host/Target prebuilts

For Linux or Darwin:

# Additional options and toolchain names will be show with --help.
$ python build.py --toolchain TOOLCHAIN_NAME

For Windows, from Linux:

$ python build.py --system windows TOOLCHAIN_NAME