Squash readelf warning on zero sh_link reloc section

On readelf examining a static executable built with current glibc,
we get a silly warning.

Section Headers:
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .note.ABI-tag     NOTE            0000000000400190 000190 000020 00   A  0   0  4
  [ 2] .note.gnu.build-id NOTE            00000000004001b0 0001b0 000024 00   A  0   0  4
readelf: Warning: [ 3]: Link field (0) should index a symtab section.
  [ 3] .rela.plt         RELA            00000000004001d8 0001d8 000228 18  AI  0  20  8

This .rela.plt section contains only IRELATIVE relocations (which have
symbol index zero), so it isn't appropriate to warn.  A zero sh_link
section is deliberately chosen for such a section (see PR10337 and
PR23850).

So this patch disables the SHT_REL* sh_link warning.  I've also
removed the .rel.dyn/.rela.dyn section name test to disable the
sh_info warning for SHT_REL* sections.  While relocation sections in
an executable need not specify the section they relocate (the
relocation sh_offset field is an address, not a section offset), that
isn't true in a relocatable file where sh_offset is relative to a
section.  If .rela.dyn happens to exist in an ET_REL object it must
specify a valid section.

	* readelf.c (process_section_headers): Don't warn on a zero
	sh_info or sh_link for any reloc section in an executable or
	shared library.  Do warn for .rel.dyn/.rela.dyn in ET_REL.
This commit is contained in:
Alan Modra 2018-11-02 13:04:31 +10:30
parent a4bcd73371
commit 285e3f99c7
2 changed files with 26 additions and 20 deletions

View File

@ -1,3 +1,9 @@
2018-11-02 Alan Modra <amodra@gmail.com>
* readelf.c (process_section_headers): Don't warn on a zero
sh_info or sh_link for any reloc section in an executable or
shared library. Do warn for .rel.dyn/.rela.dyn in ET_REL.
2018-11-01 Thomas Preud'homme <thomas.preudhomme@linaro.org>
* testsuite/config/default.exp: Define LD, LDFLAGS and

View File

@ -6299,14 +6299,21 @@ process_section_headers (Filedata * filedata)
/* Check the sh_link field. */
switch (section->sh_type)
{
case SHT_REL:
case SHT_RELA:
if (section->sh_link == 0
&& (filedata->file_header.e_type == ET_EXEC
|| filedata->file_header.e_type == ET_DYN))
/* A dynamic relocation section where all entries use a
zero symbol index need not specify a symtab section. */
break;
/* Fall through. */
case SHT_SYMTAB_SHNDX:
case SHT_GROUP:
case SHT_HASH:
case SHT_GNU_HASH:
case SHT_GNU_versym:
case SHT_REL:
case SHT_RELA:
if (section->sh_link < 1
if (section->sh_link == 0
|| section->sh_link >= filedata->file_header.e_shnum
|| (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
&& filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
@ -6320,7 +6327,7 @@ process_section_headers (Filedata * filedata)
case SHT_GNU_verneed:
case SHT_GNU_verdef:
case SHT_GNU_LIBLIST:
if (section->sh_link < 1
if (section->sh_link == 0
|| section->sh_link >= filedata->file_header.e_shnum
|| filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
warn (_("[%2u]: Link field (%u) should index a string section.\n"),
@ -6353,7 +6360,13 @@ process_section_headers (Filedata * filedata)
{
case SHT_REL:
case SHT_RELA:
if (section->sh_info < 1
if (section->sh_info == 0
&& (filedata->file_header.e_type == ET_EXEC
|| filedata->file_header.e_type == ET_DYN))
/* Dynamic relocations apply to segments, so they do not
need to specify the section they relocate. */
break;
if (section->sh_info == 0
|| section->sh_info >= filedata->file_header.e_shnum
|| (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
&& filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
@ -6363,21 +6376,8 @@ process_section_headers (Filedata * filedata)
&& filedata->section_headers[section->sh_info].sh_type != SHT_PREINIT_ARRAY
/* FIXME: Are other section types valid ? */
&& filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
{
if (section->sh_info == 0
&& (filedata->file_header.e_type == ET_EXEC
|| filedata->file_header.e_type == ET_DYN
/* These next two tests may be redundant, but
they have been left in for paranoia's sake. */
|| streq (SECTION_NAME (section), ".rel.dyn")
|| streq (SECTION_NAME (section), ".rela.dyn")))
/* Dynamic relocations apply to segments, not sections, so
they do not need an sh_info value. */
;
else
warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
i, section->sh_info);
}
warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
i, section->sh_info);
break;
case SHT_DYNAMIC: