#! /bin/sh -e
set -x
SCRATCH=scratch/no-rpath-pie-powerpc
READELF=${READELF:-readelf}

no_rpath_bin="${srcdir:?}/no-rpath-prebuild/no-rpath-pie-powerpc"

if [ ! -f "$no_rpath_bin" ]; then
  echo "no 'no-rpath' binary for '$ARCH' in '${srcdir:?}/no-rpath-prebuild'"
  exit 1
fi

rm -rf ${SCRATCH}
mkdir -p ${SCRATCH}

cp "$no_rpath_bin" ${SCRATCH}/no-rpath

oldRPath=$(../src/patchelf --print-rpath ${SCRATCH}/no-rpath)
if test -n "$oldRPath"; then exit 1; fi
../src/patchelf \
  --set-interpreter "$(../src/patchelf --print-interpreter ../src/patchelf)" \
  --set-rpath /foo:/bar:/xxxxxxxxxxxxxxx ${SCRATCH}/no-rpath

newRPath=$(../src/patchelf --print-rpath ${SCRATCH}/no-rpath)
if ! echo "$newRPath" | grep -q '/foo:/bar'; then
    echo "incomplete RPATH"
    exit 1
fi

# Tests for powerpc PIE endianness regressions
readelfData=$(${READELF} -l ${SCRATCH}/no-rpath 2>&1)

if [ "$(echo "$readelfData" | grep -c "PHDR")" != 1 ]; then
  # Triggered if PHDR errors appear on stderr
  echo "Unexpected number of occurences of PHDR in readelf results"
  exit 1
fi

virtAddr=$(echo "$readelfData" | grep "PHDR" | awk '{print $3}')
if [ "$virtAddr" != "0x00000034" ]; then
  # Triggered if the virtual address is the incorrect endianness
  echo "Unexpected virt addr, expected [0x00000034] got [$virtAddr]"
  exit 1
fi

echo "$readelfData" | grep "LOAD" | while read -r line ; do
  align=$(echo "$line" | awk '{print $NF}')
  if [ "$align" != "0x10000" ]; then
    # Triggered if the target arch was not detected properly
    echo "Unexpected Align for LOAD segment, expected [0x10000] got [$align]"
    echo "Load segment: [$line]"
    exit 1
  fi
done

