| #!/bin/sh |
| |
| set -eu |
| |
| if test "$#" -eq 4 && |
| test "$1" = "--no-weak" && |
| test "$2" = "--defined-only" && |
| test "$3" = "--format=posix"; then |
| print_file_name=0 |
| input=$4 |
| elif test "$#" -eq 5 && |
| test "$1" = "--no-weak" && |
| test "$2" = "--defined-only" && |
| test "$3" = "--format=posix" && |
| test "$4" = "--print-file-name"; then |
| print_file_name=1 |
| input=$5 |
| else |
| echo "unexpected nm arguments: $*" >&2 |
| exit 1 |
| fi |
| |
| pending_symbol=0 |
| |
| finish_symbol() |
| { |
| if test "${pending_symbol}" -eq 1; then |
| printf ' 0 0\r\n' |
| pending_symbol=0 |
| fi |
| } |
| |
| start_symbol() |
| { |
| finish_symbol |
| if test "${print_file_name}" -eq 1; then |
| printf '%s: %s %s' "$1" "$2" "$3" |
| else |
| printf '%s %s' "$2" "$3" |
| fi |
| pending_symbol=1 |
| } |
| |
| process_object() |
| { |
| object=$1 |
| case "${object}" in |
| \"*\") |
| object=${object#\"} |
| object=${object%\"} |
| ;; |
| esac |
| |
| case "${object}" in |
| *single.obj) |
| start_symbol "${object}" single T |
| ;; |
| *symbol-types.obj) |
| start_symbol "${object}" absolute A |
| start_symbol "${object}" bss B |
| start_symbol "${object}" common C |
| start_symbol "${object}" data D |
| start_symbol "${object}" import I |
| start_symbol "${object}" debug N |
| start_symbol "${object}" readonly R |
| start_symbol "${object}" '??_7Example@@6B@' R |
| start_symbol "${object}" '??_R4Example@@6B@' R |
| start_symbol "${object}" section S |
| start_symbol "${object}" text T |
| start_symbol "${object}" undefined U |
| start_symbol "${object}" weak_object V |
| start_symbol "${object}" weak W |
| start_symbol "${object}" local_absolute a |
| start_symbol "${object}" local_bss b |
| start_symbol "${object}" local_common c |
| start_symbol "${object}" local_data d |
| start_symbol "${object}" local_import i |
| start_symbol "${object}" local_debug n |
| start_symbol "${object}" local_readonly r |
| start_symbol "${object}" local_section s |
| start_symbol "${object}" local_text t |
| start_symbol "${object}" local_weak_object v |
| start_symbol "${object}" local_weak w |
| start_symbol "${object}" unknown '?' |
| ;; |
| *first.obj) |
| start_symbol "${object}" first T |
| ;; |
| *no-symbols.obj) |
| sleep 0.1 |
| printf '%s: no symbols\n' "${object}" >&2 |
| sleep 0.1 |
| finish_symbol |
| ;; |
| *second.obj) |
| start_symbol "${object}" second T |
| ;; |
| *spaced.obj) |
| start_symbol "${object}" spaced T |
| ;; |
| *mixed.obj) |
| start_symbol "${object}" mixed T |
| ;; |
| *) |
| echo "unexpected nm input: ${object}" >&2 |
| exit 1 |
| ;; |
| esac |
| } |
| |
| case "${input}" in |
| @*) |
| response=${input#@} |
| while IFS= read -r object || test -n "${object}"; do |
| process_object "${object}" |
| done < "${response}" |
| ;; |
| *) |
| process_object "${input}" |
| ;; |
| esac |
| finish_symbol |