* sunos.c (sunos_slurp_dynamic_symtab): New static function,
authorIan Lance Taylor <ian@airs.com>
Tue, 12 Sep 1995 18:59:24 +0000 (18:59 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 12 Sep 1995 18:59:24 +0000 (18:59 +0000)
broken out of sunos_canonicalize_dynamic_symtab.
(sunos_canonicalize_dynamic_symtab): Call new function
sunos_slurp_dynamic_symtab.
(sunos_add_dynamic_symbols): Add three new parameters.  Return the
dynamic symbol table to the caller.
* aoutx.h (aout_link_add_symbols): Permit add_dynamic_symbols
callback to override the symbols being read.
* libaout.h (struct aout_backend_data): Add three new parameters
to add_dynamic_symbols callback.

bfd/ChangeLog
bfd/aoutx.h
bfd/libaout.h
bfd/sunos.c

index 17027a8..589764c 100644 (file)
@@ -1,5 +1,16 @@
 Tue Sep 12 12:14:33 1995  Ian Lance Taylor  <ian@cygnus.com>
 
+       * sunos.c (sunos_slurp_dynamic_symtab): New static function,
+       broken out of sunos_canonicalize_dynamic_symtab.
+       (sunos_canonicalize_dynamic_symtab): Call new function
+       sunos_slurp_dynamic_symtab.
+       (sunos_add_dynamic_symbols): Add three new parameters.  Return the
+       dynamic symbol table to the caller.
+       * aoutx.h (aout_link_add_symbols): Permit add_dynamic_symbols
+       callback to override the symbols being read.
+       * libaout.h (struct aout_backend_data): Add three new parameters
+       to add_dynamic_symbols callback.
+
        Extensive minor changes to avoid various gcc warnings.  Also:
        * Makefile.in (BFD32_BACKENDS): Remove coff-arm.o.
        * archures.c (bfd_arch_info_type): Change mach field from long to
index 64b826e..2a44a1f 100644 (file)
@@ -3126,6 +3126,7 @@ aout_link_add_symbols (abfd, info)
                                     bfd_vma, const char *, boolean,
                                     boolean,
                                     struct bfd_link_hash_entry **));
+  struct external_nlist *syms;
   bfd_size_type sym_count;
   char *strings;
   boolean copy;
@@ -3133,6 +3134,7 @@ aout_link_add_symbols (abfd, info)
   register struct external_nlist *p;
   struct external_nlist *pend;
 
+  syms = obj_aout_external_syms (abfd);
   sym_count = obj_aout_external_sym_count (abfd);
   strings = obj_aout_external_strings (abfd);
   if (info->keep_memory)
@@ -3140,6 +3142,14 @@ aout_link_add_symbols (abfd, info)
   else
     copy = true;
 
+  if ((abfd->flags & DYNAMIC) != 0
+      && aout_backend_info (abfd)->add_dynamic_symbols != NULL)
+    {
+      if (! ((*aout_backend_info (abfd)->add_dynamic_symbols)
+            (abfd, info, &syms, &sym_count, &strings)))
+       return false;
+    }
+
   /* We keep a list of the linker hash table entries that correspond
      to particular symbols.  We could just look them up in the hash
      table, but keeping the list is more efficient.  Perhaps this
@@ -3155,18 +3165,11 @@ aout_link_add_symbols (abfd, info)
     }
   obj_aout_sym_hashes (abfd) = sym_hash;
 
-  if ((abfd->flags & DYNAMIC) != 0
-      && aout_backend_info (abfd)->add_dynamic_symbols != NULL)
-    {
-      if (! (*aout_backend_info (abfd)->add_dynamic_symbols) (abfd, info))
-       return false;
-    }
-
   add_one_symbol = aout_backend_info (abfd)->add_one_symbol;
   if (add_one_symbol == NULL)
     add_one_symbol = _bfd_generic_link_add_one_symbol;
 
-  p = obj_aout_external_syms (abfd);
+  p = syms;
   pend = p + sym_count;
   for (; p < pend; p++, sym_hash++)
     {
index a40f3c0..dd98d12 100644 (file)
@@ -16,7 +16,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #ifndef LIBAOUT_H
 #define LIBAOUT_H
@@ -127,7 +127,9 @@ struct aout_backend_data
 
   /* Callback from the add symbols phase of the linker code to handle
      a dynamic object.  */
-  boolean (*add_dynamic_symbols) PARAMS ((bfd *, struct bfd_link_info *));
+  boolean (*add_dynamic_symbols) PARAMS ((bfd *, struct bfd_link_info *,
+                                         struct external_nlist **,
+                                         bfd_size_type *, char **));
 
   /* Callback from the add symbols phase of the linker code to handle
      adding a single symbol to the global linker hash table.  */
@@ -145,14 +147,17 @@ struct aout_backend_data
   boolean (*write_dynamic_symbol) PARAMS ((bfd *, struct bfd_link_info *,
                                           struct aout_link_hash_entry *));
 
-  /* This callback is called by the linker for each reloc against an
-     external symbol.  RELOC is a pointer to the unswapped reloc.  If
-     *SKIP is set to true, the reloc will be skipped.  */
+  /* If this callback is not NULL, the linker calls it for each reloc.
+     RELOC is a pointer to the unswapped reloc.  If *SKIP is set to
+     true, the reloc will be skipped.  *RELOCATION may be changed to
+     change the effects of the relocation.  */
   boolean (*check_dynamic_reloc) PARAMS ((struct bfd_link_info *info,
                                          bfd *input_bfd,
                                          asection *input_section,
                                          struct aout_link_hash_entry *h,
-                                         PTR reloc, boolean *skip));
+                                         PTR reloc, bfd_byte *contents,
+                                         boolean *skip,
+                                         bfd_vma *relocation));
 
   /* Called at the end of a link to finish up any dynamic linking
      information.  */
@@ -217,12 +222,12 @@ enum machine_type {
   M_SPARC_NETBSD = 138,        /* NetBSD/sparc binary */
   M_MIPS1 = 151,        /* MIPS R2000/R3000 binary */
   M_MIPS2 = 152,        /* MIPS R4000/R6000 binary */
-  M_HP200 = 200,       /* HP 200 (68010) BSD binary */
-  M_HP300 = (300 % 256), /* HP 300 (68020+68881) BSD binary */
-  M_HPUX = (0x20c % 256)/* HP 200/300 HPUX binary */
 /* start-sanitize-rce */
   M_RCE = 155,         /* Motorola RCE binary */
 /* end-sanitize-rce */
+  M_HP200 = 200,       /* HP 200 (68010) BSD binary */
+  M_HP300 = (300 % 256), /* HP 300 (68020+68881) BSD binary */
+  M_HPUX = (0x20c % 256)/* HP 200/300 HPUX binary */
 };
 
 #define N_DYNAMIC(exec) ((exec).a_info & 0x80000000)
@@ -340,6 +345,11 @@ struct aoutdata {
 
   /* A pointer for shared library information.  */
   PTR dynamic_info;
+
+  /* A mapping from local symbols to offsets into the global offset
+     table, used when linking on SunOS.  This is indexed by the symbol
+     index.  */
+  bfd_vma *local_got_offsets;
 };
 
 struct  aout_data_struct {
@@ -381,6 +391,9 @@ struct aout_section_data_struct
 #define aout_section_data(s) \
   ((struct aout_section_data_struct *) (s)->used_by_bfd)
 
+#define set_aout_section_data(s,v) \
+  ((s)->used_by_bfd = (PTR)&(v)->relocs)
+
 /* Prototype declarations for functions defined in aoutx.h  */
 
 boolean
@@ -440,10 +453,14 @@ NAME(aout,get_symtab) PARAMS ((bfd *abfd, asymbol **location));
 
 void
 NAME(aout,swap_ext_reloc_in) PARAMS ((bfd *, struct reloc_ext_external *,
-                                     arelent *, asymbol **));
+                                     arelent *, asymbol **, bfd_size_type));
 void
 NAME(aout,swap_std_reloc_in) PARAMS ((bfd *, struct reloc_std_external *,
-                                     arelent *, asymbol **));
+                                     arelent *, asymbol **, bfd_size_type));
+
+reloc_howto_type *
+NAME(aout,reloc_type_lookup) PARAMS ((bfd *abfd,
+                                     bfd_reloc_code_real_type code));
 
 boolean
 NAME(aout,slurp_reloc_table) PARAMS ((bfd *abfd, sec_ptr asect,
@@ -475,6 +492,13 @@ NAME(aout,find_nearest_line) PARAMS ((bfd *abfd, asection *section,
       asymbol **symbols, bfd_vma offset, CONST char **filename_ptr,
       CONST char **functionname_ptr, unsigned int *line_ptr));
 
+long
+NAME(aout,read_minisymbols) PARAMS ((bfd *, boolean, PTR *, unsigned int *));
+
+asymbol *
+NAME(aout,minisymbol_to_symbol) PARAMS ((bfd *, boolean, const PTR,
+                                        asymbol *));
+
 int
 NAME(aout,sizeof_headers) PARAMS ((bfd *abfd, boolean exec));
 
index e3d0699..c2cf453 100644 (file)
@@ -29,6 +29,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 static boolean sunos_read_dynamic_info PARAMS ((bfd *));
 static long sunos_get_dynamic_symtab_upper_bound PARAMS ((bfd *));
+static boolean sunos_slurp_dynamic_symtab PARAMS ((bfd *));
 static long sunos_canonicalize_dynamic_symtab PARAMS ((bfd *, asymbol **));
 static long sunos_get_dynamic_reloc_upper_bound PARAMS ((bfd *));
 static long sunos_canonicalize_dynamic_reloc
@@ -40,7 +41,8 @@ static struct bfd_link_hash_table *sunos_link_hash_table_create
 static boolean sunos_create_dynamic_sections
   PARAMS ((bfd *, struct bfd_link_info *, boolean));
 static boolean sunos_add_dynamic_symbols
-  PARAMS ((bfd *, struct bfd_link_info *));
+  PARAMS ((bfd *, struct bfd_link_info *, struct external_nlist **,
+          bfd_size_type *, char **));
 static boolean sunos_add_one_symbol
   PARAMS ((struct bfd_link_info *, bfd *, const char *, flagword, asection *,
           bfd_vma, const char *, boolean, boolean,
@@ -243,28 +245,26 @@ sunos_get_dynamic_symtab_upper_bound (abfd)
   return (info->dynsym_count + 1) * sizeof (asymbol *);
 }
 
-/* Read in the dynamic symbols.  */
+/* Read the external dynamic symbols.  */
 
-static long
-sunos_canonicalize_dynamic_symtab (abfd, storage)
+static boolean
+sunos_slurp_dynamic_symtab (abfd)
      bfd *abfd;
-     asymbol **storage;
 {
   struct sunos_dynamic_info *info;
-  unsigned long i;
 
   /* Get the general dynamic information.  */
   if (obj_aout_dynamic_info (abfd) == NULL)
     {
       if (! sunos_read_dynamic_info (abfd))
-         return -1;
+         return false;
     }
 
   info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd);
   if (! info->valid)
     {
       bfd_set_error (bfd_error_no_symbols);
-      return -1;
+      return false;
     }
 
   /* Get the dynamic nlist structures.  */
@@ -277,7 +277,7 @@ sunos_canonicalize_dynamic_symtab (abfd, storage)
       if (info->dynsym == NULL && info->dynsym_count != 0)
        {
          bfd_set_error (bfd_error_no_memory);
-         return -1;
+         return false;
        }
       if (bfd_seek (abfd, info->dyninfo.ld_stab, SEEK_SET) != 0
          || (bfd_read ((PTR) info->dynsym, info->dynsym_count,
@@ -289,7 +289,7 @@ sunos_canonicalize_dynamic_symtab (abfd, storage)
              bfd_release (abfd, info->dynsym);
              info->dynsym = NULL;
            }
-         return -1;
+         return false;
        }
     }
 
@@ -300,7 +300,7 @@ sunos_canonicalize_dynamic_symtab (abfd, storage)
       if (info->dynstr == NULL && info->dyninfo.ld_symb_size != 0)
        {
          bfd_set_error (bfd_error_no_memory);
-         return -1;
+         return false;
        }
       if (bfd_seek (abfd, info->dyninfo.ld_symbols, SEEK_SET) != 0
          || (bfd_read ((PTR) info->dynstr, 1, info->dyninfo.ld_symb_size,
@@ -312,10 +312,28 @@ sunos_canonicalize_dynamic_symtab (abfd, storage)
              bfd_release (abfd, info->dynstr);
              info->dynstr = NULL;
            }
-         return -1;
+         return false;
        }
     }
 
+  return true;
+}
+
+/* Read in the dynamic symbols.  */
+
+static long
+sunos_canonicalize_dynamic_symtab (abfd, storage)
+     bfd *abfd;
+     asymbol **storage;
+{
+  struct sunos_dynamic_info *info;
+  unsigned long i;
+
+  if (! sunos_slurp_dynamic_symtab (abfd))
+    return -1;
+
+  info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd);
+
 #ifdef CHECK_DYNAMIC_HASH
   /* Check my understanding of the dynamic hash table by making sure
      that each symbol can be located in the hash table.  */
@@ -828,12 +846,16 @@ sunos_create_dynamic_sections (abfd, info, needed)
    set.  */
 
 static boolean
-sunos_add_dynamic_symbols (abfd, info)
+sunos_add_dynamic_symbols (abfd, info, symsp, sym_countp, stringsp)
      bfd *abfd;
      struct bfd_link_info *info;
+     struct external_nlist **symsp;
+     bfd_size_type *sym_countp;
+     char **stringsp;
 {
   asection *s;
   bfd *dynobj;
+  struct sunos_dynamic_info *dinfo;
 
   /* We do not want to include the sections in a dynamic object in the
      output file.  We hack by simply clobbering the list of sections
@@ -898,6 +920,15 @@ sunos_add_dynamic_symbols (abfd, info)
        return false;
     }
 
+  /* Pick up the dynamic symbols and return them to the caller.  */
+  if (! sunos_slurp_dynamic_symtab (abfd))
+    return false;
+
+  dinfo = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd);
+  *symsp = dinfo->dynsym;
+  *sym_countp = dinfo->dynsym_count;
+  *stringsp = dinfo->dynstr;
+
   return true;
 }