#!/usr/bin/env bash

# Source https://gist.github.com/vladimyr/9a03481154cd3048a486bdf71e5e1535/57e57a6ace6fb2c8bba948bce726df7a96c3f99f
# This scripts lets you check which minimum GLIBC version an executable requires.
# Simply run './glibc-check.sh path/to/your/binary'
MAX_VER="${MAX_VER:-2.28}"

BINARY="$1"

# Version comparison function in bash
vercomp() {
  if [[ $1 == "$2" ]]; then
    return 0
  fi
  local i ver1 ver2
  IFS="." read -ra ver1 <<<"$1"
  IFS="." read -ra ver2 <<<"$2"
  # fill empty fields in ver1 with zeros
  for ((i = ${#ver1[@]}; i < ${#ver2[@]}; i++)); do
    ver1[i]=0
  done
  for ((i = 0; i < ${#ver1[@]}; i++)); do
    if [[ -z ${ver2[i]} ]]; then
      # fill empty fields in ver2 with zeros
      ver2[i]=0
    fi
    if ((10#${ver1[i]} > 10#${ver2[i]})); then
      return 1
    fi
    if ((10#${ver1[i]} < 10#${ver2[i]})); then
      return 2
    fi
  done
  return 0
}

IFS="
"
VERS=$(objdump -T "$BINARY" | grep GLIBC_ | sed 's/.*GLIBC_\([.0-9]*\).*/\1/g' | sort -u)

for VER in $VERS; do
  vercomp "$VER" "$MAX_VER"
  COMP=$?
  if [[ $COMP -eq 1 ]]; then
    echo "Error! ${BINARY} requests GLIBC ${VER}, which is higher than target ${MAX_VER}"
    echo "Affected symbols:"
    objdump -T "$BINARY" | grep -F "GLIBC_${VER}"
    echo "Looking for symbols in libraries..."
    for LIBRARY in $(ldd "$BINARY" | cut -d ' ' -f 3); do
      echo "$LIBRARY"
      objdump -T "$LIBRARY" | grep -F "GLIBC_${VER}"
    done
    exit 27
  else
    echo "Found version ${VER}"
  fi
done