kit

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

macho-symbols.sh (2547B)


      1 #!/bin/sh
      2 # Verify that resolved per-input reference slots do not become duplicate
      3 # external definitions in a linked Mach-O LC_SYMTAB or linker symbol report.
      4 # Distinct global aliases at the same address must remain distinct.
      5 
      6 set -eu
      7 
      8 root=$(CDPATH= cd -- "$(dirname "$0")/../.." && pwd)
      9 runner=${LINK_EXE_RUNNER:-$root/build/test/link-exe-runner}
     10 kit=${KIT:-$root/build/kit}
     11 cc=${CC:-clang}
     12 nm_bin=$(command -v llvm-nm 2>/dev/null || command -v nm 2>/dev/null || true)
     13 work=$root/build/test/macho-symbols
     14 src=$root/test/link/macho_symbols
     15 
     16 [ -x "$runner" ] || {
     17   printf 'macho-symbols: missing runner: %s\n' "$runner" >&2
     18   exit 1
     19 }
     20 [ -x "$kit" ] || {
     21   printf 'macho-symbols: missing kit binary: %s\n' "$kit" >&2
     22   exit 1
     23 }
     24 [ -n "$nm_bin" ] || {
     25   printf 'macho-symbols: no platform nm oracle\n' >&2
     26   exit 1
     27 }
     28 
     29 rm -rf "$work"
     30 mkdir -p "$work"
     31 
     32 defined_count() {
     33   awk -v sym="$2" '
     34     $NF == sym && $(NF - 1) != "U" { ++n }
     35     END { print n + 0 }
     36   ' "$1"
     37 }
     38 
     39 check_one() {
     40   arch=$1
     41   triple=$2
     42   out=$work/$arch
     43   mkdir -p "$out"
     44 
     45   for base in definition reference_a reference_b; do
     46     "$cc" --target="$triple" -O0 -ffreestanding -fno-stack-protector \
     47       -fno-PIC -fno-pie -c "$src/$base.c" -o "$out/$base.o" \
     48       >"$out/compile-$base.stdout" 2>"$out/compile-$base.stderr"
     49   done
     50   "$cc" --target="$triple" -c "$src/aliases.S" -o "$out/aliases.o" \
     51     >"$out/compile-aliases.stdout" 2>"$out/compile-aliases.stderr"
     52 
     53   KIT_TEST_ARCH=$arch KIT_TEST_OBJ=macho "$runner" \
     54     --entry test_main --symbols "$out/symbols.txt" -o "$out/linked.macho" \
     55     "$out/definition.o" "$out/reference_a.o" "$out/reference_b.o" \
     56     "$out/aliases.o" >"$out/link.stdout" 2>"$out/link.stderr"
     57   "$nm_bin" "$out/linked.macho" >"$out/platform-nm.txt" \
     58     2>"$out/platform-nm.stderr"
     59   "$kit" nm "$out/linked.macho" >"$out/kit-nm.txt" \
     60     2>"$out/kit-nm.stderr"
     61 
     62   for table in "$out/platform-nm.txt" "$out/kit-nm.txt" \
     63                "$out/symbols.txt"; do
     64     [ "$(defined_count "$table" _audit_macho_provided)" -eq 1 ] || {
     65       printf 'macho-symbols: %s: duplicate canonical definition in %s\n' \
     66         "$arch" "$table" >&2
     67       exit 1
     68     }
     69     for alias in _audit_macho_alias_a _audit_macho_alias_b; do
     70       [ "$(defined_count "$table" "$alias")" -eq 1 ] || {
     71         printf 'macho-symbols: %s: missing distinct alias %s in %s\n' \
     72           "$arch" "$alias" "$table" >&2
     73         exit 1
     74       }
     75     done
     76   done
     77   printf 'ok  macho canonical symbols %s\n' "$arch"
     78 }
     79 
     80 check_one aa64 arm64-apple-macos
     81 check_one x64 x86_64-apple-macos