2001-05-24 H.J. Lu <hjl@gnu.org>
[deliverable/binutils-gdb.git] / bfd / elfxx-ia64.c
index b8705c18386bfe5862bfc2d792ba26338020996e..f0f64f654412425af84d3a28b1ac4803d499a91c 100644 (file)
@@ -921,12 +921,14 @@ static inline boolean
 is_unwind_section_name (name)
        const char *name;
 {
-  size_t len1, len2;
+  size_t len1, len2, len3;
 
   len1 = sizeof (ELF_STRING_ia64_unwind) - 1;
   len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
-  return (strncmp (name, ELF_STRING_ia64_unwind, len1) == 0
-         && strncmp (name, ELF_STRING_ia64_unwind_info, len2) != 0);
+  len3 = sizeof (ELF_STRING_ia64_unwind_once) - 1;
+  return ((strncmp (name, ELF_STRING_ia64_unwind, len1) == 0
+          && strncmp (name, ELF_STRING_ia64_unwind_info, len2) != 0)
+         || strncmp (name, ELF_STRING_ia64_unwind_once, len3) == 0);
 }
 
 /* Handle an IA-64 specific section when reading an object file.  This
@@ -1065,6 +1067,18 @@ elfNN_ia64_final_write_processing (abfd, linker)
                /* .IA_64.unwindFOO -> FOO */
                text_sect = bfd_get_section_by_name (abfd, sname);
            }
+         else if (sname
+                  && (len = sizeof (ELF_STRING_ia64_unwind_once) - 1,
+                      strncmp (sname, ELF_STRING_ia64_unwind_once, len)) == 0)
+           {
+             /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.t.FOO */
+             size_t len2 = sizeof (".gnu.linkonce.t.") - 1;
+             char *once_name = alloca (len2 + strlen (sname) - len + 1);
+
+             memcpy (once_name, ".gnu.linkonce.t.", len2);
+             strcpy (once_name + len2, sname + len);
+             text_sect = bfd_get_section_by_name (abfd, once_name);
+           }
          else
            /* last resort: fall back on .text */
            text_sect = bfd_get_section_by_name (abfd, ".text");
@@ -1182,20 +1196,11 @@ elfNN_ia64_aix_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
     {
       int i;
       
-      /* SHN_MONTEREY_SYSCALL (Description from IBM):
-        Special symbols on AIX; if the value is non-zero, the value
-         should be put in the gp member of the function descriptor.  the
-         function address member should be set to the address of the entry
-         point of the user-space portion of the system call (epc insn in a
-         priviledged page).  If the symbol value is zero, look in the special
-         table for extended system calls.  The number for extended system
-         calls will come from that table.  The index is set when the linker
-         sees an export file that contains the syscall attribute after an
-         exported symbol.  Kernel extensions indicate extended system calls
-         they define by having STO_MONTEREY_SYSCALL in their st_other symbol
-         table member. This is used by the system loader to add extended
-         system calls to its table, which is subsequently provided to the
-         runtime linker at each process startup.  */
+      /* SHN_AIX_SYSCALL: Treat this as any other symbol.  The special symbol
+        is only relevant when compiling code for extended system calls.
+        Replace the "special" section with .text, if possible. */
+      /* FIXME need to determine the proper section instead of defaulting to
+        .text.  */
       for (i = 1; i < elf_elfheader (abfd)->e_shnum; i++)
        {
          asection * sec = bfd_section_from_elf_index (abfd, i);
@@ -1207,8 +1212,6 @@ elfNN_ia64_aix_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
            }
        }
 
-      /* FIXME need to determine the proper section instead of defaulting to
-        .text.  */
       if (*secp == NULL)
        *secp = bfd_abs_section_ptr;
       
@@ -1535,7 +1538,8 @@ elfNN_ia64_hash_hide_symbol (info, xh)
   h = (struct elfNN_ia64_link_hash_entry *)xh;
 
   h->root.elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
-  h->root.dynindx = -1;
+  if ((h->root.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0)
+    h->root.dynindx = -1;
 
   for (dyn_i = h->info; dyn_i; dyn_i = dyn_i->next)
     dyn_i->want_plt2 = 0;
This page took 0.02372 seconds and 4 git commands to generate.