object.sh (2393B)
1 #!/usr/bin/env bash 2 set -eu 3 4 ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" 5 . "$ROOT/test/tier1/objlink/common.sh" 6 7 ARCH="${KIT_TEST_ARCH:-aa64}" 8 TRIPLE="$(t1_clang_triple "$ARCH")" 9 KITCHEN="$ROOT/test/tier1/kitchen/objlink/object" 10 WORK="$(t1_work_dir "$ROOT" object)" 11 LOG_DIR="$(t1_log_dir "$ROOT")" 12 NORMALIZE="$ROOT/test/elf/normalize.py" 13 READELF_BIN="$(command -v llvm-readelf 2>/dev/null || command -v readelf 2>/dev/null || true)" 14 KIT="${KIT:-$ROOT/build/kit}" 15 16 mkdir -p "$WORK" "$LOG_DIR" 17 t1_require_exe "$KIT" 'run: make bin' 18 command -v clang >/dev/null 2>&1 || { echo "clang not found" >&2; exit 2; } 19 command -v python3 >/dev/null 2>&1 || { echo "python3 not found" >&2; exit 2; } 20 [ -n "$READELF_BIN" ] || { 21 echo "llvm-readelf/readelf not found" >&2 22 exit 2 23 } 24 25 echo "tier1 object: compile $ARCH" 26 t1_run "$LOG_DIR/object-clang.log" \ 27 clang --target="$TRIPLE" -c -O0 -fcommon -ffunction-sections \ 28 -fdata-sections "$KITCHEN/kitchen_object.c" -o "$WORK/kitchen.o" 29 30 echo "tier1 object: roundtrip" 31 t1_run "$LOG_DIR/object-objcopy.log" \ 32 "$KIT" objcopy "$WORK/kitchen.o" "$WORK/kitchen.rt.o" 33 34 echo "tier1 object: inspect required ELF surface" 35 "$READELF_BIN" -aW "$WORK/kitchen.o" >"$WORK/kitchen.raw.readelf" \ 36 2>"$LOG_DIR/object-raw-readelf.log" 37 t1_assert_grep "object/common-symbol" \ 38 '[[:space:]]COM[[:space:]]+tier1_common($|[[:space:]])' \ 39 "$WORK/kitchen.raw.readelf" 40 t1_assert_grep "object/weak-symbol" \ 41 '[[:space:]]WEAK[[:space:]]+DEFAULT[[:space:]]+[A-Z0-9]+[[:space:]]+tier1_weak_hook($|[[:space:]])' \ 42 "$WORK/kitchen.raw.readelf" 43 t1_assert_grep "object/hidden-symbol" \ 44 '[[:space:]]GLOBAL[[:space:]]+HIDDEN[[:space:]]+[A-Z0-9]+[[:space:]]+tier1_hidden_add($|[[:space:]])' \ 45 "$WORK/kitchen.raw.readelf" 46 t1_assert_grep "object/custom-data-section" \ 47 '[[:space:]]\.data\.tier1[[:space:]]+PROGBITS' \ 48 "$WORK/kitchen.raw.readelf" 49 t1_assert_grep "object/data-relocation" \ 50 'Relocation section .*\.rela?\.(data|rodata).*' \ 51 "$WORK/kitchen.raw.readelf" 52 53 echo "tier1 object: normalize diff" 54 python3 "$NORMALIZE" readelf "$WORK/kitchen.o" >"$WORK/kitchen.readelf" \ 55 2>"$LOG_DIR/object-readelf-a.log" 56 python3 "$NORMALIZE" readelf "$WORK/kitchen.rt.o" >"$WORK/kitchen.rt.readelf" \ 57 2>"$LOG_DIR/object-readelf-b.log" 58 t1_diff "$WORK/kitchen.readelf" "$WORK/kitchen.rt.readelf" "$WORK/kitchen.diff" 59 60 echo "tier1 object: ok"