#!/bin/bash # This scripts builds a self-contained executable file for Valgrind. # Usage: # ./mk-self-contained-valgrind.sh /path/to/valgrind/installation tool_name resulting_binary [tool_flag] # Take the valgrind installation from here: IN_DIR="$1" # Tool name: TOOL="$2" # Put the result here: OUT="$3" # If not empty, use as the --tool= value: if [ "$4" == "" ] then TOOLFLAG=$TOOL else TOOLFLAG="$4" fi # The files/dirs to take: IN_FILES="bin/valgrind lib/valgrind/vgpreload_core* lib/valgrind/*$TOOL* lib/valgrind/default.supp" EXCLUDE_FILES="lib/valgrind/*$TOOL-debug*" rm -f $OUT && touch $OUT && chmod +x $OUT || exit 1 # Create the header. cat << 'EOF' >> $OUT || exit 1 #!/bin/bash # This is a self-extracting executable of Valgrind. # This file is autogenerated by mk-self-contained-valgrind.sh. # We extract the temporary files to $VALGRIND_EXTRACT_DIR/valgrind.XXXXXX VALGRIND_EXTRACT_DIR=${VALGRIND_EXTRACT_DIR:-/tmp} EXTRACT_DIR="$(mktemp -d $VALGRIND_EXTRACT_DIR/valgrind.XXXXXX)" cleanup() { rm -rf $EXTRACT_DIR } # We will cleanup on exit. trap cleanup EXIT mkdir -p $EXTRACT_DIR chmod +rwx $EXTRACT_DIR EOF # end of header # Create the self-extractor # Create the runner cat << 'EOF' >> $OUT || exit 1 # Extract: sed '1,/^__COMPRESSED_DATA_BELOW__$/d' $0 | tar xz -C $EXTRACT_DIR # Run # echo Extracting Valgrind to $EXTRACT_DIR export VALGRIND_LIB="$EXTRACT_DIR/lib/valgrind" export VALGRIND_LIB_INNER="$EXTRACT_DIR/lib/valgrind" EOF echo "\$EXTRACT_DIR/bin/valgrind --tool=$TOOLFLAG \"\$@\"" >> $OUT || exit 1 cat << 'EOF' >> $OUT || exit 1 EXIT_STATUS=$? cleanup # the trap above will handle the cleanup only if we are in bash 3.x exit $EXIT_STATUS # make sure to return the exit code from valgrind. __COMPRESSED_DATA_BELOW__ EOF # Dump the compressed binary at the very end of the file. (cd $IN_DIR && tar zcvh --exclude=$EXCLUDE_FILES $IN_FILES) >> $OUT || exit 1 echo "File $OUT successfully created"