| # This is an awk script to process the output of elf/check-localplt. | 
 | # The first file argument is the file of expected results. | 
 | # Each line is either a comment starting with # or it looks like: | 
 | #	libfoo.so: function | 
 | # or | 
 | #	libfoo.so: function + {RELA|REL} RELOC | 
 | # or | 
 | #	libfoo.so: function ? | 
 | # The first entry means that one is required. | 
 | # The second entry means that one is required and relocation may also be | 
 | # {RELA|REL} RELOC. | 
 | # The third entry means that a PLT entry for function is optional in | 
 | # libfoo.so. | 
 | # The second file argument is - and this (stdin) receives the output | 
 | # of the check-localplt program. | 
 |  | 
 | BEGIN { result = 0 } | 
 |  | 
 | FILENAME != "-" && /^#/ { next } | 
 |  | 
 | FILENAME != "-" { | 
 |   if (NF == 5 && $3 == "+" && ($4 == "RELA" || $4 == "REL")) { | 
 |     accept_type[$1 " " $2] = $4; | 
 |     accept_reloc[$1 " " $2] = $5; | 
 |   } else if (NF != 2 && !(NF == 3 && $3 == "?")) { | 
 |     printf "%s:%d: bad data line: %s\n", FILENAME, FNR, $0 > "/dev/stderr"; | 
 |     result = 2; | 
 |   } else { | 
 |     accept[$1 " " $2] = NF == 2; | 
 |   } | 
 |   next; | 
 | } | 
 |  | 
 | NF != 2 && !(NF == 4 && ($3 == "RELA" || $3 == "REL")) { | 
 |   print "Unexpected output from check-localplt:", $0 > "/dev/stderr"; | 
 |   result = 2; | 
 |   next | 
 | } | 
 |  | 
 | { | 
 |   key = $1 " " $2 | 
 |   if ($3 == "RELA" || $3 == "REL") { | 
 |     # Entries like: | 
 |     # libc.so: free + RELA R_X86_64_GLOB_DAT | 
 |     # may be ignored. | 
 |     if (key in accept_type && accept_type[key] == $3 && accept_reloc[key] == $4) { | 
 |       # Match | 
 |       # libc.so: free + RELA R_X86_64_GLOB_DAT | 
 |       delete accept_type[key] | 
 |     } | 
 |   } else if (NF == 2 && key in accept_reloc) { | 
 |     # Match | 
 |     # libc.so: free | 
 |     # against | 
 |     # libc.so: free + RELA R_X86_64_GLOB_DAT | 
 |     if (key in accept_type) | 
 |       delete accept_type[key] | 
 |   } else if (key in accept) { | 
 |     delete accept[key] | 
 |   } else { | 
 |     print "Extra PLT reference:", $0; | 
 |     if (result == 0) | 
 |       result = 1; | 
 |   } | 
 | } | 
 |  | 
 | END { | 
 |   for (key in accept) { | 
 |     if (accept[key]) { | 
 |       # It's mandatory. | 
 |       print "Missing required PLT reference:", key; | 
 |       result = 1; | 
 |     } | 
 |   } | 
 |  | 
 |   for (key in accept_type) { | 
 |     # It's mandatory. | 
 |     print "Missing required PLT or " accept_reloc[key] " reference:", key; | 
 |     result = 1; | 
 |   } | 
 |  | 
 |   exit(result); | 
 | } |