#!/bin/sh set -eu : "${PACKAGE_VERSION:?}" : "${CPU_AS:?}" "${CPU_LD:?}" "${CPU_RUN:?}" "${CPU_READELF:?}" : "${CPU_AR:?}" "${CPU_NM:?}" "${CPU_STRIP:?}" "${STRIP_FIXTURE:?}" TMP=${TMPDIR:-/tmp}/libmcpu-strip-$$ mkdir -p "$TMP" trap 'rm -rf "$TMP"' EXIT HUP INT TERM cat > "$TMP/main.s" <<'EOS' .global _life .text _start_life: LDI r64@0x00000, 42 LDI r32@0x00030, 0 EXIT r32@0x00030 EOS cat > "$TMP/dynamic-main.s" <<'EOS' .global _life .extern add_one .text _start_life: LDI r64@0x00000, 41 CALL add_one MOV r64@0x00018, r64@0x00000 LDI r32@0x00030, 0 EXIT r32@0x00030 EOS cat > "$TMP/add-one.s" <<'EOS' .global add_one .text add_one: LDI r64@0x00008, 1 IADD r64@0x00000, r64@0x00000, r64@0x00008 RET EOS "$CPU_AS" -o "$TMP/main.o" "$TMP/main.s" "$CPU_AS" -o "$TMP/add-one.o" "$TMP/add-one.s" "$CPU_AS" -o "$TMP/dynamic-main.o" "$TMP/dynamic-main.s" "$CPU_LD" --stack-size=4096 --no-heap -o "$TMP/main" "$TMP/main.o" "$CPU_LD" --dynamic --stack-size=4096 --no-heap -o "$TMP/dynamic-main" "$TMP/dynamic-main.o" "$CPU_LD" --shared --soname=libadd.so.1 -o "$TMP/libadd.so" "$TMP/add-one.o" "$CPU_AR" rcs "$TMP/libadd.a" "$TMP/add-one.o" # ET_REL .symtab/.strtab are link semantics and are preserved byte-for-byte. "$CPU_STRIP" -o "$TMP/main.stripped.o" "$TMP/main.o" cmp "$TMP/main.o" "$TMP/main.stripped.o" "$CPU_READELF" -s "$TMP/main.stripped.o" | grep -q '_life' # Current final writers already emit no ordinary .symtab, so these are no-ops. "$CPU_STRIP" -o "$TMP/main.clean" "$TMP/main" cmp "$TMP/main" "$TMP/main.clean" "$CPU_STRIP" -o "$TMP/libadd.clean.so" "$TMP/libadd.so" cmp "$TMP/libadd.so" "$TMP/libadd.clean.so" "$CPU_READELF" -S "$TMP/libadd.clean.so" > "$TMP/libadd.sections" grep -q '\.dynsym' "$TMP/libadd.sections" grep -q '\.dynstr' "$TMP/libadd.sections" grep -q '\.mcpu.target' "$TMP/libadd.sections" # The same removal policy on ET_DYN must preserve dynamic symbols/relocations. "$STRIP_FIXTURE" "$TMP/libadd.so" "$TMP/libadd.with-sym.so" "$CPU_READELF" -S -s "$TMP/libadd.with-sym.so" > "$TMP/dyn-before.txt" grep -q '\.symtab' "$TMP/dyn-before.txt" "$CPU_STRIP" -o "$TMP/libadd.really-stripped.so" "$TMP/libadd.with-sym.so" "$CPU_READELF" -S -s "$TMP/libadd.really-stripped.so" > "$TMP/dyn-after.txt" if grep -q '\.symtab' "$TMP/dyn-after.txt"; then echo "ordinary ET_DYN .symtab survived mcpu-strip" >&2 exit 1 fi grep -q '\.dynsym' "$TMP/dyn-after.txt" grep -q '\.dynstr' "$TMP/dyn-after.txt" test "`MCPU_LD_PRELOAD= "$CPU_RUN" --ldpreload="$TMP/libadd.really-stripped.so" --int-reg=r64@0x00018 "$TMP/dynamic-main"`" = 42 # Deterministic ET_REL archives keep their members and symbol index intact. "$CPU_STRIP" -o "$TMP/libadd.clean.a" "$TMP/libadd.a" cmp "$TMP/libadd.a" "$TMP/libadd.clean.a" "$CPU_NM" -A "$TMP/libadd.clean.a" | grep -q 'add_one' # Add a conventional non-runtime .symtab/.strtab to a valid ET_EXEC fixture. # mcpu-strip must remove them, shrink the file and leave execution untouched. "$STRIP_FIXTURE" "$TMP/main" "$TMP/main.with-sym" chmod 755 "$TMP/main.with-sym" "$CPU_READELF" -S -s "$TMP/main.with-sym" > "$TMP/before.txt" grep -q '\.symtab' "$TMP/before.txt" grep -q 'fixture_symbol' "$TMP/before.txt" before=`wc -c < "$TMP/main.with-sym"` "$CPU_STRIP" -o "$TMP/main.really-stripped" "$TMP/main.with-sym" "$CPU_READELF" -S -s "$TMP/main.really-stripped" > "$TMP/after.txt" if grep -q '\.symtab' "$TMP/after.txt"; then echo "ordinary .symtab survived mcpu-strip" >&2 exit 1 fi if grep -q 'fixture_symbol' "$TMP/after.txt"; then echo "ordinary symbol string survived mcpu-strip" >&2 exit 1 fi after=`wc -c < "$TMP/main.really-stripped"` test "$after" -lt "$before" test "`stat -c %a "$TMP/main.really-stripped"`" = 755 test "`"$CPU_RUN" --int-reg=r64@0x00000 "$TMP/main.really-stripped"`" = 42 # In-place replacement is atomic from the caller's point of view and keeps mode. cp "$TMP/main.with-sym" "$TMP/main.inplace" chmod 751 "$TMP/main.inplace" "$CPU_STRIP" "$TMP/main.inplace" test "`stat -c %a "$TMP/main.inplace"`" = 751 test "`"$CPU_RUN" --int-reg=r64@0x00000 "$TMP/main.inplace"`" = 42 if "$CPU_READELF" -S "$TMP/main.inplace" | grep -q '\.symtab'; then echo "in-place strip left .symtab" >&2 exit 1 fi "$CPU_STRIP" --help | grep -q -- '--output=FILE' "$CPU_STRIP" --version | grep -Fq "$PACKAGE_VERSION" if "$CPU_STRIP" "$TMP/main" "$TMP/main.clean" >/dev/null 2>&1; then echo "mcpu-strip unexpectedly accepted multiple input files" >&2 exit 1 fi exit 0