#!/bin/sh set -eu : "${PACKAGE_VERSION:?}" : "${CPU_AS:?}" "${CPU_LD:?}" "${CPU_AR:?}" "${CPU_OBJDUMP:?}" TMP=${TMPDIR:-/tmp}/libmcpu-objdump-$$ trap 'rm -rf "$TMP"' EXIT HUP INT TERM mkdir -p "$TMP" cat > "$TMP/unit.s" <<'EOS' .global entry .global data_global .extern external_function .text entry: SETF CF CLRF AF CLRCPUF CLRMPUF LDI r64@0x00000, 41 CALL local_helper CALL external_function RET local_helper: LDI r64@0x00008, 1 IADD r64@0x00000, r64@0x00000, r64@0x00008 RET .data data_global: .integer 64, 7 data_pointer: .ptr data_global EOS cat > "$TMP/dyn.s" <<'EOS' .global dyn_api .global dyn_data .text dyn_api: CALL local_dyn RET local_dyn: LDI r64@0x00008, 2 RET .data dyn_data: .integer 64, 9 EOS cat > "$TMP/a.s" <<'EOS' .global archive_a .text archive_a: RET EOS cat > "$TMP/b.s" <<'EOS' .global archive_b .text archive_b: RET EOS "$CPU_AS" -o "$TMP/unit.o" "$TMP/unit.s" "$CPU_AS" -o "$TMP/dyn.o" "$TMP/dyn.s" "$CPU_AS" -o "$TMP/a.o" "$TMP/a.s" "$CPU_AS" -o "$TMP/b.o" "$TMP/b.s" "$CPU_LD" --shared --soname=libobjdump.so.1 -o "$TMP/libobjdump.so" "$TMP/dyn.o" "$CPU_AR" rcs "$TMP/libobjdump.a" "$TMP/a.o" "$TMP/b.o" "$CPU_OBJDUMP" -h "$TMP/unit.o" > "$TMP/headers.txt" grep -q '^Sections:$' "$TMP/headers.txt" grep -q '\.text' "$TMP/headers.txt" grep -q '\.data' "$TMP/headers.txt" grep -q 'PROGBITS.*CODE' "$TMP/headers.txt" "$CPU_OBJDUMP" -t "$TMP/unit.o" > "$TMP/symbols.txt" grep -q '^SYMBOL TABLE:$' "$TMP/symbols.txt" grep -q ' entry$' "$TMP/symbols.txt" grep -q ' local_helper$' "$TMP/symbols.txt" grep -q ' data_global$' "$TMP/symbols.txt" grep -q ' external_function$' "$TMP/symbols.txt" "$CPU_OBJDUMP" -r "$TMP/unit.o" > "$TMP/relocs.txt" grep -q 'RELOCATION RECORDS FOR \[.text\]' "$TMP/relocs.txt" grep -q 'R_MCPU_CODE64.*local_helper' "$TMP/relocs.txt" grep -q 'R_MCPU_CODE64.*external_function' "$TMP/relocs.txt" "$CPU_OBJDUMP" -d -r "$TMP/unit.o" > "$TMP/disasm.txt" grep -q 'Disassembly of section .text:' "$TMP/disasm.txt" grep -q ':' "$TMP/disasm.txt" grep -q ':' "$TMP/disasm.txt" grep -q 'SETF.*CF' "$TMP/disasm.txt" grep -q 'CLRF.*AF' "$TMP/disasm.txt" grep -q 'CLRCPUF' "$TMP/disasm.txt" grep -q 'CLRMPUF' "$TMP/disasm.txt" grep -q 'LDI.*r64@0x00000, 41' "$TMP/disasm.txt" grep -q 'CALL.*' "$TMP/disasm.txt" grep -q 'CALL.*' "$TMP/disasm.txt" grep -q 'R_MCPU_CODE64.*local_helper' "$TMP/disasm.txt" # -r remains complete with -d: non-executable-section relocations are # printed separately while .text relocations stay next to instructions. grep -q 'RELOCATION RECORDS FOR \[.data\]' "$TMP/disasm.txt" grep -q 'R_MCPU_PTR64_DATA.*data_global' "$TMP/disasm.txt" "$CPU_OBJDUMP" -s -j .data "$TMP/unit.o" > "$TMP/data.txt" grep -q 'Contents of section .data:' "$TMP/data.txt" if grep -q 'Contents of section .text:' "$TMP/data.txt"; then echo "mcpu-objdump -j .data unexpectedly displayed .text contents" >&2 exit 1 fi "$CPU_OBJDUMP" -D -j .data "$TMP/unit.o" > "$TMP/all-data.txt" grep -q 'Disassembly of section .data:' "$TMP/all-data.txt" "$CPU_OBJDUMP" -T "$TMP/libobjdump.so" > "$TMP/dynamic.txt" grep -q '^DYNAMIC SYMBOL TABLE:$' "$TMP/dynamic.txt" grep -q ' dyn_api$' "$TMP/dynamic.txt" grep -q ' dyn_data$' "$TMP/dynamic.txt" "$CPU_OBJDUMP" -d -r "$TMP/libobjdump.so" > "$TMP/dynamic-disasm.txt" grep -q ':' "$TMP/dynamic-disasm.txt" grep -q 'CALL.*<.L\$0\$0>' "$TMP/dynamic-disasm.txt" grep -q 'R_MCPU_CODE64.*.L\$0\$0' "$TMP/dynamic-disasm.txt" "$CPU_OBJDUMP" -t "$TMP/libobjdump.a" > "$TMP/archive.txt" grep -F "$TMP/libobjdump.a(a.o):" "$TMP/archive.txt" >/dev/null grep -F "$TMP/libobjdump.a(b.o):" "$TMP/archive.txt" >/dev/null grep -q ' archive_a$' "$TMP/archive.txt" grep -q ' archive_b$' "$TMP/archive.txt" # Grouped short options and attached -j argument are accepted. "$CPU_OBJDUMP" -hdr -j.text "$TMP/unit.o" > "$TMP/grouped.txt" grep -q 'Sections:' "$TMP/grouped.txt" grep -q 'Disassembly of section .text:' "$TMP/grouped.txt" grep -q 'R_MCPU_CODE64' "$TMP/grouped.txt" # Missing/invalid input remains a hard error. dd if=/dev/zero of="$TMP/bad" bs=256 count=1 2>/dev/null if "$CPU_OBJDUMP" -h "$TMP/bad" > /dev/null 2> "$TMP/bad.err"; then echo "mcpu-objdump unexpectedly accepted a non-MELF file" >&2 exit 1 fi grep -q 'not a MELF file' "$TMP/bad.err" if "$CPU_OBJDUMP" "$TMP/unit.o" > /dev/null 2> "$TMP/no-option.err"; then echo "mcpu-objdump unexpectedly accepted no display option" >&2 exit 1 fi grep -q 'at least one display option is required' "$TMP/no-option.err" "$CPU_OBJDUMP" --help | grep -q -- '--disassemble-all' "$CPU_OBJDUMP" --help | grep -q -- '--dynamic-syms' "$CPU_OBJDUMP" --help | grep -q -- '--section=NAME' "$CPU_OBJDUMP" --version | grep -Fq "$PACKAGE_VERSION"