This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: hppa64-hp-hpux11.00: HP ELF64 brokeness (incorrect .dynamic section)


On Wed, Jul 03, 2002 at 12:35:04PM +0100, ross.alexander@uk.neceur.com wrote:
> 
> HP have sent me a copy of ld64 with the bug fixed but here is the patch
> anyway.
> 
> bfd/Changelog
>       * elf.c (bfd_elf_get_bfd_needed_list): Current HP ld64 and existing
> shared

Thanks.  I'm going to propose a different patch though, because I
noticed that we already do hpux fudges for this problem in
elflink.h:elf_link_add_object_symbols, and we also need to fix
elf.c:_bfd_elf_print_private_bfd_data.

Would you mind checking that the following does indeed cure the
hpux shared lib problem?

	* elflink.h (elf_link_add_object_symbols): Revert 1999-09-02 hpux
	fudge.
	* elf.c (bfd_section_from_shdr): Work around broken hpux shared
	libs here instead.

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre

Index: bfd/elf.c
===================================================================
RCS file: /cvs/src/src/bfd/elf.c,v
retrieving revision 1.151
diff -u -p -r1.151 elf.c
--- bfd/elf.c	2 Jul 2002 04:31:22 -0000	1.151
+++ bfd/elf.c	4 Jul 2002 04:49:34 -0000
@@ -1661,7 +1661,6 @@ bfd_section_from_shdr (abfd, shindex)
       return true;
 
     case SHT_PROGBITS:	/* Normal section with contents.  */
-    case SHT_DYNAMIC:	/* Dynamic linking information.  */
     case SHT_NOBITS:	/* .bss section.  */
     case SHT_HASH:	/* .hash section.  */
     case SHT_NOTE:	/* .note section.  */
@@ -1669,6 +1668,39 @@ bfd_section_from_shdr (abfd, shindex)
     case SHT_FINI_ARRAY:	/* .fini_array section.  */
     case SHT_PREINIT_ARRAY:	/* .preinit_array section.  */
       return _bfd_elf_make_section_from_shdr (abfd, hdr, name);
+
+    case SHT_DYNAMIC:	/* Dynamic linking information.  */
+      if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
+	return false;
+      if (elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_STRTAB)
+	{
+	  Elf_Internal_Shdr *dynsymhdr;
+
+	  /* The shared libraries distributed with hpux11 have a bogus
+	     sh_link field for the ".dynamic" section.  Find the
+	     string table for the ".dynsym" section instead.  */
+	  if (elf_dynsymtab (abfd) != 0)
+	    {
+	      dynsymhdr = elf_elfsections (abfd)[elf_dynsymtab (abfd)];
+	      hdr->sh_link = dynsymhdr->sh_link;
+	    }
+	  else
+	    {
+	      unsigned int i, num_sec;
+
+	      num_sec = elf_numsections (abfd);
+	      for (i = 1; i < num_sec; i++)
+		{
+		  dynsymhdr = elf_elfsections (abfd)[i];
+		  if (dynsymhdr->sh_type == SHT_DYNSYM)
+		    {
+		      hdr->sh_link = dynsymhdr->sh_link;
+		      break;
+		    }
+		}
+	    }
+	}
+      break;
 
     case SHT_SYMTAB:		/* A symbol table */
       if (elf_onesymtab (abfd) == shindex)
Index: bfd/elflink.h
===================================================================
RCS file: /cvs/src/src/bfd/elflink.h,v
retrieving revision 1.172
diff -u -p -r1.172 elflink.h
--- bfd/elflink.h	1 Jul 2002 08:06:46 -0000	1.172
+++ bfd/elflink.h	4 Jul 2002 04:49:40 -0000
@@ -1451,23 +1451,6 @@ elf_link_add_object_symbols (abfd, info)
 	    goto error_return;
 	  shlink = elf_elfsections (abfd)[elfsec]->sh_link;
 
-	  {
-	    /* The shared libraries distributed with hpux11 have a bogus
-	       sh_link field for the ".dynamic" section.  This code detects
-	       when SHLINK refers to a section that is not a string table
-	       and tries to find the string table for the ".dynsym" section
-	       instead.  */
-	    Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[shlink];
-	    if (shdr->sh_type != SHT_STRTAB)
-	      {
-		asection *ds = bfd_get_section_by_name (abfd, ".dynsym");
-		int elfdsec = _bfd_elf_section_from_bfd_section (abfd, ds);
-		if (elfdsec == -1)
-		  goto error_return;
-		shlink = elf_elfsections (abfd)[elfdsec]->sh_link;
-	      }
-	  }
-
 	  extdyn = dynbuf;
 	  extdynend = extdyn + s->_raw_size / sizeof (Elf_External_Dyn);
 	  rpath = 0;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]