Message ID | b9db8689f75c8225800e006655764134e4185663.1661775887.git.fweimer@redhat.com |
---|---|
State | New |
Headers | show |
Series | Rework exception handling in the dynamic loader [BZ #25486] | expand |
On 2022-08-29 08:26, Florian Weimer via Libc-alpha wrote: > On csky-linux-gnuabiv2, binutils 2.33 produces a DT_JMPREL entry > for the dynamic loader if it does not contain any PLT relocations: > > Dynamic section at offset 0x1df48 contains 19 entries: > Tag Type Name/Value > 0x0000000e (SONAME) Library soname: [ld-linux-cskyv2-hf.so.1] > 0x00000004 (HASH) 0xd4 > 0x6ffffef5 (GNU_HASH) 0x1a8 > 0x00000005 (STRTAB) 0x4ac > 0x00000006 (SYMTAB) 0x28c > 0x0000000a (STRSZ) 527 (bytes) > 0x0000000b (SYMENT) 16 (bytes) > 0x00000003 (PLTGOT) 0x1f000 > 0x00000002 (PLTRELSZ) 0 (bytes) > 0x00000014 (PLTREL) RELA > 0x00000017 (JMPREL) 0xaa4 > 0x00000007 (RELA) 0x75c > 0x00000008 (RELASZ) 840 (bytes) > 0x00000009 (RELAENT) 12 (bytes) > 0x6ffffffc (VERDEF) 0x700 > 0x6ffffffd (VERDEFNUM) 3 > 0x6ffffff0 (VERSYM) 0x6bc > 0x6ffffff9 (RELACOUNT) 68 > 0x00000000 (NULL) 0x0 > > This confuses the script: > > Unexpected output from check-localplt: …/elf/ld.so.jmprel: > *** DT_JMPREL does not match any section's address > > This commit changes the script to record the DT_PLTRELSZ value and > reject DT_JMPREL values not a section boundary only if DT_PLTRELSZ > is present with a non-zero value. > --- > scripts/localplt.awk | 18 +++++++++++++++--- > 1 file changed, 15 insertions(+), 3 deletions(-) LGTM. Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org> > > diff --git a/scripts/localplt.awk b/scripts/localplt.awk > index beaa342922..fe79ca01ab 100644 > --- a/scripts/localplt.awk > +++ b/scripts/localplt.awk > @@ -4,17 +4,25 @@ > # It writes "NAME: SYMBOL" for each PLT entry in NAME that refers to a > # symbol defined in the same object. > > -BEGIN { result = 0 } > +BEGIN { > + result = 0; > + pltrelsize = -1; > +} > > FILENAME != lastfile { > if (lastfile && jmprel_offset == 0 && rela_offset == 0 && rel_offset == 0) { > print FILENAME ": *** failed to find expected output (readelf -WSdr)"; > result = 2; > } > + if (pltrelsz > 0 && jmprel_offset == -1) { > + print FILENAME ": Could not find section for DT_JMPREL"; > + result = 2; > + } > lastfile = FILENAME; > jmprel_offset = 0; > rela_offset = 0; > rel_offset = 0; > + pltrelsz = -1; > delete section_offset_by_address; > } > > @@ -82,12 +90,16 @@ $2 == "(JMPREL)" { > if (jmprel_addr in section_offset_by_address) { > jmprel_offset = section_offset_by_address[jmprel_addr]; > } else { > - print FILENAME ": *** DT_JMPREL does not match any section's address"; > - result = 2; > + jmprel_offset = -1 > } > next > } > > +$2 == "(PLTRELSZ)" { > + pltrelsz = strtonum($3); > + next > +} > + > $2 == "(RELA)" { > rela_addr = strtonum($3); > if (rela_addr in section_offset_by_address) {
diff --git a/scripts/localplt.awk b/scripts/localplt.awk index beaa342922..fe79ca01ab 100644 --- a/scripts/localplt.awk +++ b/scripts/localplt.awk @@ -4,17 +4,25 @@ # It writes "NAME: SYMBOL" for each PLT entry in NAME that refers to a # symbol defined in the same object. -BEGIN { result = 0 } +BEGIN { + result = 0; + pltrelsize = -1; +} FILENAME != lastfile { if (lastfile && jmprel_offset == 0 && rela_offset == 0 && rel_offset == 0) { print FILENAME ": *** failed to find expected output (readelf -WSdr)"; result = 2; } + if (pltrelsz > 0 && jmprel_offset == -1) { + print FILENAME ": Could not find section for DT_JMPREL"; + result = 2; + } lastfile = FILENAME; jmprel_offset = 0; rela_offset = 0; rel_offset = 0; + pltrelsz = -1; delete section_offset_by_address; } @@ -82,12 +90,16 @@ $2 == "(JMPREL)" { if (jmprel_addr in section_offset_by_address) { jmprel_offset = section_offset_by_address[jmprel_addr]; } else { - print FILENAME ": *** DT_JMPREL does not match any section's address"; - result = 2; + jmprel_offset = -1 } next } +$2 == "(PLTRELSZ)" { + pltrelsz = strtonum($3); + next +} + $2 == "(RELA)" { rela_addr = strtonum($3); if (rela_addr in section_offset_by_address) {