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: More HP-UX IA64 changes



Here is a followup to my earlier patch addressing the changes that Alan
Modra pointed out.  I fixed the formating issues and removed my addition
of elfNN_ia64_copy_private_bfd_data which is no longer necessary.

Steve Ellcey
sje@cup.hp.com

2001-12-19  Steve Ellcey  <sje@cup.hp.com>
	* include/elf/ia64.h (ELF_STRING_ia64_unwind_hdr): New Macro for HP-UX
	  (SHT_IA_64_HP_OPT_ANOT): Ditto
	  (PT_IA_64_HP_OPT_ANOT): Ditto
	  (PT_IA_64_HP_HSL_ANOT): Ditto
	  (PT_IA_64_HP_STACK): Ditto
	  (SHN_IA_64_ANSI_COMMON): Ditto
	* binutils/readelf.c (get_ia64_segment_type): Add support for macros.
	  (get_segment_type): Add support for IA64 specific macros.
	* bfd/elfxx-ia64.c (is_unwind_section_name): Add target vector as
	  argument so we can handle HP-UX specially.
	  (elfNN_ia64_hpux_vec): New for use in is_unwind_section_name.
	  (elfNN_hpux_backend_section_from_bfd_section): New for support
	  of SHN_IA_64_ANSI_COMMON.
	  (elfNN_ia64_relax_section): Add support for SHN_IA_64_ANSI_COMMON.
	  (is_unwind_section_name): Add special HP-UX support.
	  (elfNN_ia64_section_from_shdr): Add support for more sections.
	  (elfNN_ia64_fake_sections): Modify is_unwind_section_name call and
	  add support for more sections.
	  (elfNN_ia64_additional_program_headers): Modify
	  is_unwind_section_name call.
	  (elfNN_ia64_modify_segment_map): Remove assumption that there is
	  only one unwind section in segment.



--- orig/src/include/elf/ia64.h	Mon Dec 24 10:16:53 2001
+++ src/include/elf/ia64.h	Mon Dec 24 10:22:01 2001
@@ -49,6 +49,8 @@ Foundation, Inc., 59 Temple Place - Suit
 #define ELF_STRING_ia64_unwind_info	".IA_64.unwind_info"
 #define ELF_STRING_ia64_unwind_once	".gnu.linkonce.ia64unw."
 #define ELF_STRING_ia64_unwind_info_once ".gnu.linkonce.ia64unwi."
+/* .IA_64.unwind_hdr is only used by HP-UX.  */
+#define ELF_STRING_ia64_unwind_hdr	".IA_64.unwind_hdr"
 
 /* Bits in the sh_flags field of Elf64_Shdr:  */
 
@@ -60,6 +62,12 @@ Foundation, Inc., 59 Temple Place - Suit
 #define SHT_IA_64_EXT		(SHT_LOPROC + 0)	/* extension bits */
 #define SHT_IA_64_UNWIND	(SHT_LOPROC + 1)	/* unwind bits */
 
+/* SHT_IA_64_HP_OPT_ANOT is only generated by HPUX compilers for its
+   optimization annotation section.  GCC does not generate it but we
+   want readelf to know what they are.  Do not use two capital Ns in
+   annotate or sed will turn it into 32 or 64 during the build.  */
+#define SHT_IA_64_HP_OPT_ANOT	0x60000004
+
 /* Bits in the p_flags field of Elf64_Phdr:  */
 
 #define PF_IA_64_NORECOV	0x80000000
@@ -69,9 +77,23 @@ Foundation, Inc., 59 Temple Place - Suit
 #define PT_IA_64_ARCHEXT	(PT_LOPROC + 0)	/* arch extension bits */
 #define PT_IA_64_UNWIND 	(PT_LOPROC + 1)	/* ia64 unwind bits */
 
+/* HP-UX specific values for p_type in Elf64_Phdr.
+   These values are currently just used to make
+   readelf more usable on HP-UX.  */
+
+#define PT_IA_64_HP_OPT_ANOT	(PT_LOOS + 0x12)
+#define PT_IA_64_HP_HSL_ANOT	(PT_LOOS + 0x13)
+#define PT_IA_64_HP_STACK	(PT_LOOS + 0x14)
+
 /* Possible values for d_tag in Elf64_Dyn:  */
 
 #define DT_IA_64_PLT_RESERVE	(DT_LOPROC + 0)
+
+/* This section only used by HP-UX, The HP linker gives weak symbols
+   precedence over regular common symbols.  We want common to override
+   weak.  Using this common instead of SHN_COMMON does that.  */
+
+#define SHN_IA_64_ANSI_COMMON 0xFF00
 
 /* ia64-specific relocation types: */
 
--- orig/src/binutils/readelf.c	Mon Dec 24 10:17:19 2001
+++ src/binutils/readelf.c	Wed Dec 26 13:51:18 2001
@@ -1861,6 +1861,10 @@ get_ia64_segment_type (type)
     {
     case PT_IA_64_ARCHEXT:	return "IA_64_ARCHEXT";
     case PT_IA_64_UNWIND:	return "IA_64_UNWIND";
+    case PT_HP_TLS:		return "HP_TLS";
+    case PT_IA_64_HP_OPT_ANOT:	return "HP_OPT_ANNOT";
+    case PT_IA_64_HP_HSL_ANOT:	return "HP_HSL_ANNOT";
+    case PT_IA_64_HP_STACK:	return "HP_STACK";
     default:
       break;
     }
@@ -1922,6 +1926,9 @@ get_segment_type (p_type)
 	    {
 	    case EM_PARISC:
 	      result = get_parisc_segment_type (p_type);
+	      break;
+	    case EM_IA_64:
+	      result = get_ia64_segment_type (p_type);
 	      break;
 	    default:
 	      result = NULL;
--- orig/src/bfd/elfxx-ia64.c	Mon Dec 24 10:18:05 2001
+++ src/bfd/elfxx-ia64.c	Wed Dec 26 14:08:47 2001
@@ -163,7 +163,7 @@ static boolean elfNN_ia64_relax_section
   PARAMS((bfd *abfd, asection *sec, struct bfd_link_info *link_info,
 	  boolean *again));
 static boolean is_unwind_section_name
-  PARAMS ((const char *));
+  PARAMS ((bfd *abfd, const char *));
 static boolean elfNN_ia64_section_from_shdr
   PARAMS ((bfd *, ElfNN_Internal_Shdr *, char *));
 static boolean elfNN_ia64_section_flags
@@ -307,8 +307,12 @@ static boolean elfNN_ia64_print_private_
   PARAMS ((bfd *abfd, PTR ptr));
 static enum elf_reloc_type_class elfNN_ia64_reloc_type_class
   PARAMS ((const Elf_Internal_Rela *));
+static boolean elfNN_ia64_hpux_vec
+  PARAMS ((const bfd_target *vec));
 static void elfNN_hpux_post_process_headers
   PARAMS ((bfd *abfd, struct bfd_link_info *info));
+boolean elfNN_hpux_backend_section_from_bfd_section
+  PARAMS ((bfd *abfd, ElfNN_Internal_Shdr *hdr, asection *sec, int *retval));
 
 /* ia64-specific relocation */
 
@@ -772,6 +776,8 @@ elfNN_ia64_relax_section (abfd, sec, lin
 	    tsec = bfd_abs_section_ptr;
 	  else if (isym.st_shndx == SHN_COMMON)
 	    tsec = bfd_com_section_ptr;
+	  else if (isym.st_shndx == SHN_IA_64_ANSI_COMMON)
+	    tsec = bfd_com_section_ptr;
 	  else
 	    tsec = bfd_section_from_elf_index (abfd, isym.st_shndx);
 
@@ -973,11 +979,16 @@ elfNN_ia64_relax_section (abfd, sec, lin
 /* Return true if NAME is an unwind table section name.  */
 
 static inline boolean
-is_unwind_section_name (name)
+is_unwind_section_name (abfd, name)
+	bfd *abfd;
 	const char *name;
 {
   size_t len1, len2, len3;
 
+  if (elfNN_ia64_hpux_vec (abfd->xvec)
+      && !strcmp (name, ELF_STRING_ia64_unwind_hdr))
+    return false;
+
   len1 = sizeof (ELF_STRING_ia64_unwind) - 1;
   len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
   len3 = sizeof (ELF_STRING_ia64_unwind_once) - 1;
@@ -1005,6 +1016,10 @@ elfNN_ia64_section_from_shdr (abfd, hdr,
   switch (hdr->sh_type)
     {
     case SHT_IA_64_UNWIND:
+    case SHT_INIT_ARRAY:
+    case SHT_FINI_ARRAY:
+    case SHT_PREINIT_ARRAY:
+    case SHT_IA_64_HP_OPT_ANOT:
       break;
 
     case SHT_IA_64_EXT:
@@ -1052,7 +1067,7 @@ elfNN_ia64_fake_sections (abfd, hdr, sec
 
   name = bfd_get_section_name (abfd, sec);
 
-  if (is_unwind_section_name (name))
+  if (is_unwind_section_name (abfd, name))
     {
       /* We don't have the sections numbered at this point, so sh_info
 	 is set later, in elfNN_ia64_final_write_processing.  */
@@ -1061,6 +1076,14 @@ elfNN_ia64_fake_sections (abfd, hdr, sec
     }
   else if (strcmp (name, ELF_STRING_ia64_archext) == 0)
     hdr->sh_type = SHT_IA_64_EXT;
+  else if (strcmp (name, ".init_array") == 0)
+    hdr->sh_type = SHT_INIT_ARRAY;
+  else if (strcmp (name, ".fini_array") == 0)
+    hdr->sh_type = SHT_FINI_ARRAY;
+  else if (strcmp (name, ".preinit_array") == 0)
+    hdr->sh_type = SHT_PREINIT_ARRAY;
+  else if (strcmp (name, ".HP.opt_annot") == 0)
+    hdr->sh_type = SHT_IA_64_HP_OPT_ANOT;
   else if (strcmp (name, ".reloc") == 0)
     /*
      * This is an ugly, but unfortunately necessary hack that is
@@ -1331,7 +1354,7 @@ elfNN_ia64_additional_program_headers (a
 
   /* Count how many PT_IA_64_UNWIND segments we need.  */
   for (s = abfd->sections; s; s = s->next)
-    if (is_unwind_section_name(s->name) && (s->flags & SEC_LOAD))
+    if (is_unwind_section_name (abfd, s->name) && (s->flags & SEC_LOAD))
       ++ret;
 
   return ret;
@@ -1344,6 +1367,8 @@ elfNN_ia64_modify_segment_map (abfd)
   struct elf_segment_map *m, **pm;
   Elf_Internal_Shdr *hdr;
   asection *s;
+  boolean unwind_found;
+  asection *unwind_sec;
 
   /* If we need a PT_IA_64_ARCHEXT segment, it must come before
      all PT_LOAD segments.  */
@@ -1386,8 +1411,24 @@ elfNN_ia64_modify_segment_map (abfd)
       if (s && (s->flags & SEC_LOAD))
 	{
 	  for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
-	    if (m->p_type == PT_IA_64_UNWIND && m->sections[0] == s)
-	      break;
+	    if (m->p_type == PT_IA_64_UNWIND)
+	      {
+		/* Look through all sections in the unwind segment
+		   for a match since there may be multiple sections
+		   to a segment.  */
+
+		unwind_sec = m->sections[0];
+		unwind_found = false;
+		while (unwind_sec != NULL && !unwind_found)
+		  {
+		    if (unwind_sec == s)
+		      unwind_found = true;
+		    else
+		      unwind_sec = unwind_sec -> next;
+		  }
+		if (unwind_found)
+		  break;
+	      }
 
 	  if (m == NULL)
 	    {
@@ -4421,6 +4462,13 @@ elfNN_ia64_reloc_type_class (rela)
     }
 }
 
+static boolean
+elfNN_ia64_hpux_vec (const bfd_target *vec)
+{
+  extern const bfd_target bfd_elfNN_ia64_hpux_big_vec;
+  return (vec == & bfd_elfNN_ia64_hpux_big_vec);
+}
+
 static void
 elfNN_hpux_post_process_headers (abfd, info)
 	bfd *abfd;
@@ -4431,6 +4479,21 @@ elfNN_hpux_post_process_headers (abfd, i
   i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_HPUX;
   i_ehdrp->e_ident[EI_ABIVERSION] = 1;
 }
+
+boolean
+elfNN_hpux_backend_section_from_bfd_section (abfd, hdr, sec, retval)
+	bfd *abfd ATTRIBUTE_UNUSED;
+	Elf32_Internal_Shdr *hdr ATTRIBUTE_UNUSED;
+	asection *sec;
+	int *retval;
+{
+  if (bfd_is_com_section (sec))
+    {
+      *retval = SHN_IA_64_ANSI_COMMON;
+      return true;
+    }
+  return false;
+}
 
 #define TARGET_LITTLE_SYM		bfd_elfNN_ia64_little_vec
 #define TARGET_LITTLE_NAME		"elfNN-ia64-little"
@@ -4541,6 +4604,9 @@ elfNN_hpux_post_process_headers (abfd, i
 
 #undef  elf_backend_post_process_headers
 #define elf_backend_post_process_headers elfNN_hpux_post_process_headers
+
+#undef  elf_backend_section_from_bfd_section
+#define elf_backend_section_from_bfd_section elfNN_hpux_backend_section_from_bfd_section
 
 #undef  ELF_MAXPAGESIZE
 #define ELF_MAXPAGESIZE                 0x1000  /* 1K */


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