mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	On x86, linker in binutils 2.26 and newer consolidates R_*_JUMP_SLOT with R_*_GLOB_DAT relocation against the same symbol. This patch extends local PLT reference check to support alternate relocations. [BZ #18078] * scripts/check-localplt.awk: Support alternate relocations. * scripts/localplt.awk: Also check relocations in DT_RELA/DT_REL sections. * sysdeps/unix/sysv/linux/i386/localplt.data: Mark free and malloc entries with + REL R_386_GLOB_DAT. * sysdeps/x86_64/localplt.data: New file.
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Awk
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Awk
		
	
	
	
	
	
| # 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);
 | |
| }
 |