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