kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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"