Make binutils not barf on binaries linked with lld

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Make binutils not barf on binaries linked with lld

Mark Kettenis
So lld generates .gnu.hash sections that our ancient binutils doesn't
grok.  With the diff below (taken from FreeBSD's binutils, so GPLv2)
fixes this.

ok?


Index: gnu/usr.bin/binutils-2.17/bfd/elf.c
===================================================================
RCS file: /cvs/src/gnu/usr.bin/binutils-2.17/bfd/elf.c,v
retrieving revision 1.12
diff -u -p -r1.12 elf.c
--- gnu/usr.bin/binutils-2.17/bfd/elf.c 10 Aug 2016 20:46:08 -0000 1.12
+++ gnu/usr.bin/binutils-2.17/bfd/elf.c 24 Apr 2018 18:41:12 -0000
@@ -1825,6 +1825,7 @@ bfd_section_from_shdr (bfd *abfd, unsign
     case SHT_FINI_ARRAY: /* .fini_array section.  */
     case SHT_PREINIT_ARRAY: /* .preinit_array section.  */
     case SHT_GNU_LIBLIST: /* .gnu.liblist section.  */
+    case SHT_GNU_HASH: /* .gnu.hash section.  */
       return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
 
     case SHT_DYNAMIC: /* Dynamic linking information.  */
@@ -2264,6 +2265,7 @@ static const struct bfd_elf_special_sect
   { ".gnu.version_r", 14,  0, SHT_GNU_verneed, 0 },
   { ".gnu.liblist",   12,  0, SHT_GNU_LIBLIST, SHF_ALLOC },
   { ".gnu.conflict",  13,  0, SHT_RELA,     SHF_ALLOC },
+  { ".gnu.hash",       9,  0, SHT_GNU_HASH, SHF_ALLOC },
   { NULL,              0,  0, 0,            0 }
 };
 
@@ -2785,6 +2787,10 @@ elf_fake_sections (bfd *abfd, asection *
     case SHT_GROUP:
       this_hdr->sh_entsize = 4;
       break;
+
+    case SHT_GNU_HASH:
+      this_hdr->sh_entsize = bed->s->arch_size == 64 ? 0 : 4;
+      break;
     }
 
   if ((asect->flags & SEC_ALLOC) != 0)
@@ -3230,6 +3236,7 @@ assign_section_numbers (bfd *abfd, struc
   break;
 
  case SHT_HASH:
+ case SHT_GNU_HASH:
  case SHT_GNU_versym:
   /* sh_link is the section header index of the symbol table
      this hash table or version table is for.  */
Index: gnu/usr.bin/binutils-2.17/include/elf/common.h
===================================================================
RCS file: /cvs/src/gnu/usr.bin/binutils-2.17/include/elf/common.h,v
retrieving revision 1.7
diff -u -p -r1.7 common.h
--- gnu/usr.bin/binutils-2.17/include/elf/common.h 25 Jan 2017 08:56:08 -0000 1.7
+++ gnu/usr.bin/binutils-2.17/include/elf/common.h 24 Apr 2018 18:41:12 -0000
@@ -343,6 +343,7 @@
 #define SHT_LOOS 0x60000000 /* First of OS specific semantics */
 #define SHT_HIOS 0x6fffffff /* Last of OS specific semantics */
 
+#define SHT_GNU_HASH 0x6ffffff6 /* GNU style symbol hash table */
 #define SHT_GNU_LIBLIST 0x6ffffff7 /* List of prelink dependencies */
 
 /* The next three section types are defined by Solaris, and are named

Reply | Threaded
Open this post in threaded view
|

Re: Make binutils not barf on binaries linked with lld

Philip Guenther-2
On Tue, Apr 24, 2018 at 8:43 PM, Mark Kettenis <[hidden email]>
wrote:

> So lld generates .gnu.hash sections that our ancient binutils doesn't
> grok.  With the diff below (taken from FreeBSD's binutils, so GPLv2)
> fixes this.
>
> ok?
>
> --- gnu/usr.bin/binutils-2.17/bfd/elf.c 10 Aug 2016 20:46:08 -0000
> 1.12
> +++ gnu/usr.bin/binutils-2.17/bfd/elf.c 24 Apr 2018 18:41:12 -0000
>
...

> @@ -2785,6 +2787,10 @@ elf_fake_sections (bfd *abfd, asection *
>      case SHT_GROUP:
>        this_hdr->sh_entsize = 4;
>        break;
> +
> +    case SHT_GNU_HASH:
> +      this_hdr->sh_entsize = bed->s->arch_size == 64 ? 0 : 4;
> +      break;
>

The entity size is _zero_ for 64bit archs?  (Or does that not really matter
because you're not trying to make it dump the actual hash table itself?)

Other than that possibly being wrong, ok guenther
Reply | Threaded
Open this post in threaded view
|

Re: Make binutils not barf on binaries linked with lld

Mark Kettenis
> From: Philip Guenther <[hidden email]>
> Date: Tue, 24 Apr 2018 21:09:32 +0200
>
> On Tue, Apr 24, 2018 at 8:43 PM, Mark Kettenis <[hidden email]>
> wrote:
>
> > So lld generates .gnu.hash sections that our ancient binutils doesn't
> > grok.  With the diff below (taken from FreeBSD's binutils, so GPLv2)
> > fixes this.
> >
> > ok?
> >
> > --- gnu/usr.bin/binutils-2.17/bfd/elf.c 10 Aug 2016 20:46:08 -0000
> > 1.12
> > +++ gnu/usr.bin/binutils-2.17/bfd/elf.c 24 Apr 2018 18:41:12 -0000
> >
> ...
>
> > @@ -2785,6 +2787,10 @@ elf_fake_sections (bfd *abfd, asection *
> >      case SHT_GROUP:
> >        this_hdr->sh_entsize = 4;
> >        break;
> > +
> > +    case SHT_GNU_HASH:
> > +      this_hdr->sh_entsize = bed->s->arch_size == 64 ? 0 : 4;
> > +      break;
> >
>
> The entity size is _zero_ for 64bit archs?  (Or does that not really matter
> because you're not trying to make it dump the actual hash table itself?)

Yes.  The binaries produced by lld have it as 0 on amd64 and 4 on
armv7, which matches the code I copied from FreeBSD.

> Other than that possibly being wrong, ok guenther

Thanks