lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | # This is an awk script to process the output of elf/check-localplt. |
| 2 | # The first file argument is the file of expected results. |
| 3 | # Each line is either a comment starting with # or it looks like: |
| 4 | # libfoo.so: function |
| 5 | # or |
| 6 | # libfoo.so: function + {RELA|REL} RELOC |
| 7 | # or |
| 8 | # libfoo.so: function ? |
| 9 | # The first entry means that one is required. |
| 10 | # The second entry means that one is required and relocation may also be |
| 11 | # {RELA|REL} RELOC. |
| 12 | # The third entry means that a PLT entry for function is optional in |
| 13 | # libfoo.so. |
| 14 | # The second file argument is - and this (stdin) receives the output |
| 15 | # of the check-localplt program. |
| 16 | |
| 17 | BEGIN { result = 0 } |
| 18 | |
| 19 | FILENAME != "-" && /^#/ { next } |
| 20 | |
| 21 | FILENAME != "-" { |
| 22 | if (NF == 5 && $3 == "+" && ($4 == "RELA" || $4 == "REL")) { |
| 23 | accept_type[$1 " " $2] = $4; |
| 24 | accept_reloc[$1 " " $2] = $5; |
| 25 | } else if (NF != 2 && !(NF == 3 && $3 == "?")) { |
| 26 | printf "%s:%d: bad data line: %s\n", FILENAME, FNR, $0 > "/dev/stderr"; |
| 27 | result = 2; |
| 28 | } else { |
| 29 | accept[$1 " " $2] = NF == 2; |
| 30 | } |
| 31 | next; |
| 32 | } |
| 33 | |
| 34 | NF != 2 && !(NF == 4 && ($3 == "RELA" || $3 == "REL")) { |
| 35 | print "Unexpected output from check-localplt:", $0 > "/dev/stderr"; |
| 36 | result = 2; |
| 37 | next |
| 38 | } |
| 39 | |
| 40 | { |
| 41 | key = $1 " " $2 |
| 42 | if ($3 == "RELA" || $3 == "REL") { |
| 43 | # Entries like: |
| 44 | # libc.so: free + RELA R_X86_64_GLOB_DAT |
| 45 | # may be ignored. |
| 46 | if (key in accept_type && accept_type[key] == $3 && accept_reloc[key] == $4) { |
| 47 | # Match |
| 48 | # libc.so: free + RELA R_X86_64_GLOB_DAT |
| 49 | delete accept_type[key] |
| 50 | } |
| 51 | } else if (NF == 2 && key in accept_reloc) { |
| 52 | # Match |
| 53 | # libc.so: free |
| 54 | # against |
| 55 | # libc.so: free + RELA R_X86_64_GLOB_DAT |
| 56 | if (key in accept_type) |
| 57 | delete accept_type[key] |
| 58 | } else if (key in accept) { |
| 59 | delete accept[key] |
| 60 | } else { |
| 61 | print "Extra PLT reference:", $0; |
| 62 | if (result == 0) |
| 63 | result = 1; |
| 64 | } |
| 65 | } |
| 66 | |
| 67 | END { |
| 68 | for (key in accept) { |
| 69 | if (accept[key]) { |
| 70 | # It's mandatory. |
| 71 | print "Missing required PLT reference:", key; |
| 72 | result = 1; |
| 73 | } |
| 74 | } |
| 75 | |
| 76 | for (key in accept_type) { |
| 77 | # It's mandatory. |
| 78 | print "Missing required PLT or " accept_reloc[key] " reference:", key; |
| 79 | result = 1; |
| 80 | } |
| 81 | |
| 82 | exit(result); |
| 83 | } |