diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | elf/Makefile | 3 | ||||
-rw-r--r-- | scripts/check-localplt.awk | 53 | ||||
-rw-r--r-- | scripts/data/localplt-generic.data | 3 |
4 files changed, 62 insertions, 2 deletions
@@ -5,6 +5,11 @@ 2012-04-24 Roland McGrath <roland@hack.frob.com> + * scripts/check-localplt.awk: New file. + * elf/Makefile ($(objpfx)check-localplt.out): Use that script instead + of diff. + * scripts/data/localplt-generic.data: Add a comment. + * sysdeps/mach/hurd/symlink.c: Don't call __mach_port_deallocate on NODE when __dir_mkfile failed. * sysdeps/mach/hurd/symlinkat.c: Likewise. diff --git a/elf/Makefile b/elf/Makefile index a77e792..fd766c5 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -933,8 +933,7 @@ $(objpfx)check-localplt.out: $(objpfx)check-localplt \ $(common-objpfx)crypt/libcrypt.so \ $(check-data) $(dir $<)$(notdir $<) $(filter-out $< $(check-data),$^) | \ - LC_ALL=C sort | \ - diff -u $(check-data) - > $@ + $(AWK) -f $(..)scripts/check-localplt.awk $(check-data) - endif $(objpfx)tst-dlopenrpathmod.so: $(libdl) diff --git a/scripts/check-localplt.awk b/scripts/check-localplt.awk new file mode 100644 index 0000000..bb1b912 --- /dev/null +++ b/scripts/check-localplt.awk @@ -0,0 +1,53 @@ +# 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 ? +# The latter means that a PLT entry for function is optional in libfoo.so. +# The former means one is required. +# The second file argument is - and this (stdin) receives the output +# of the check-localplt program. + +BEGIN { result = 0 } + +FILENAME != "-" && /^#/ { next } + +FILENAME != "-" { + 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 { + print "Unexpected output from check-localplt:", $0 > "/dev/stderr"; + result = 2; + next +} + +{ + key = $1 " " $2 + 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; + } + } + + exit(result); +} diff --git a/scripts/data/localplt-generic.data b/scripts/data/localplt-generic.data index 2219aa9..d296519 100644 --- a/scripts/data/localplt-generic.data +++ b/scripts/data/localplt-generic.data @@ -1,3 +1,6 @@ +# See scripts/check-localplt.awk for how this file is processed. +# PLT use is required for the malloc family and for matherr because +# users can define their own functions and have library internals call them. libc.so: calloc libc.so: free libc.so: malloc |