mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +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);
 | 
						|
}
 |