#!/bin/sh # Überschreibe Funktionen beim Aufruf eines Programms # $Id: preload.sh,v 1.3 2024/06/22 08:05:57 oj14ozun Exp $ # https://wwwcip.cs.fau.de/~oj14ozun/sp/preload.sh # # Dieses Skript benutzt ein Trick des Dynamic Linker/Loaders (ld.so) # um das "Überladen" von Funktionen aus einem Programm zur laufzeit zu # ermöglichen. Bspw. bei der Aufgabe 4, Halde, hat man eine Datei mit # Funktionen "malloc", "free", ... (welche nicht mit `static' # definiert wurden) in einer Datei "halde.c" stehen. Wenn man die # Aufgabe 2, Wsort, mit seiner eigenen Halde testen will, kann man # # $ ./preload.sh halde.c ./wsort < wlist0 # # ausführen, und damit deine eigene Halde benutzen! # # Um dieses Skript zu benutzen, denkt daran es mit den richtigen # Rechten zu speichern: # # $ wget https://wwwcip.cs.fau.de/~oj14ozun/sp/preload.sh # $ chmod u+x preload.sh # # oder noch besser in ~/.local/bin, wenn dass Verzeichnis auch in # $PATH liegt. set -eu # ensure we are on a Linux-based system if [ "$(uname -s)" != "Linux" ] then >&2 echo "This script requires a Linux kernel" exit 1 fi # parse command line arguments if [ $# -lt 2 ] then >&2 echo "Usage: $0 [c file] [regular command...]" exit 1 fi MODULE_PATH=$(realpath "$1"); shift # create a temporary directory for the shared object TMP="$(mktemp -qd --tmpdir=/dev/shm)" cleanup() { rm -rf "$TMP" } trap cleanup EXIT # compile the shared object OUT="$TMP/${MODULE_NAME%.c}.so" 1>&2 "${CC:-gcc}" -fPIC -shared -o "$OUT" "$MODULE_PATH" # run the program with modified environment env LD_PRELOAD="$OUT" "$@"