diff options
Diffstat (limited to 'REORG.TODO/scripts/check-localplt.awk')
-rw-r--r-- | REORG.TODO/scripts/check-localplt.awk | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/REORG.TODO/scripts/check-localplt.awk b/REORG.TODO/scripts/check-localplt.awk new file mode 100644 index 0000000000..3965292888 --- /dev/null +++ b/REORG.TODO/scripts/check-localplt.awk @@ -0,0 +1,83 @@ +# 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); +} |