* elfcode.h (NAME(bfd_elf,size_dynamic_sections)): Add soname
authorIan Lance Taylor <ian@airs.com>
Tue, 30 Aug 1994 16:04:40 +0000 (16:04 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 30 Aug 1994 16:04:40 +0000 (16:04 +0000)
argument, and use it to set DT_SONAME dynamic entry.
* bfd-in.h (bfd_elf32_size_dynamic_sections): Update prototype.
(bfd_elf64_size_dynamic_sections): Update prototype.
* bfd-in2.h: Rebuilt.

bfd/ChangeLog
bfd/bfd-in2.h
bfd/elfcode.h

index e311a16..e2a1c5c 100644 (file)
@@ -1,3 +1,11 @@
+Tue Aug 30 11:43:30 1994  Eric Youngdale  (ericy@cais.cais.com)
+
+       * elfcode.h (NAME(bfd_elf,size_dynamic_sections)): Add soname
+       argument, and use it to set DT_SONAME dynamic entry.
+       * bfd-in.h (bfd_elf32_size_dynamic_sections): Update prototype.
+       (bfd_elf64_size_dynamic_sections): Update prototype.
+       * bfd-in2.h: Rebuilt.
+
 Fri Aug 26 15:47:57 1994  Ian Lance Taylor  (ian@sanguine.cygnus.com)
 
        * coffgen.c (coff_real_object_p): Set obj_raw_syment_count.
index 622651a..408ca58 100644 (file)
@@ -99,15 +99,16 @@ typedef enum bfd_boolean {bfd_false, bfd_true} boolean;
 /* typedef off_t       file_ptr; */
 typedef long int file_ptr;
 
-/* Support for different sizes of target format ints and addresses.  If the
-   host implements 64-bit values, it defines BFD_HOST_64_BIT to be the appropriate
-   type.  Otherwise, this code will fall back on gcc's "long long" type if gcc
-   is being used.  BFD_HOST_64_BIT must be defined in such a way as to be a valid
-   type name by itself or with "unsigned" prefixed.  It should be a signed
-   type by itself.
+/* Support for different sizes of target format ints and addresses.
+   If the host implements 64-bit values, it defines BFD_HOST_64_BIT to
+   be the appropriate type.  Otherwise, this code will fall back on
+   gcc's "long long" type if gcc is being used.  BFD_HOST_64_BIT must
+   be defined in such a way as to be a valid type name by itself or
+   with "unsigned" prefixed.  It should be a signed type by itself.
 
-   If neither is the case, then compilation will fail if 64-bit targets are
-   requested.  If you don't request any 64-bit targets, you should be safe. */
+   If neither is the case, then compilation will fail if 64-bit
+   targets are requested.  If you don't request any 64-bit targets,
+   you should be safe. */
 
 #ifdef BFD64
 
@@ -213,7 +214,8 @@ typedef enum bfd_format {
 #define D_PAGED        0x100
 
 /* BFD is relaxable (this means that bfd_relax_section may be able to
-   do something).  */
+   do something) (sometimes bfd_relax_section can do something even if
+   this is not set).  */
 #define BFD_IS_RELAXABLE 0x200
 
 /* This may be set before writing out a BFD to request using a
@@ -271,7 +273,6 @@ typedef struct lineno_cache_entry {
 \f
 /* object and core file sections */
 
-
 #define        align_power(addr, align)        \
        ( ((addr) + ((1<<(align))-1)) & (-1 << (align)))
 
@@ -424,6 +425,18 @@ extern void bfd_hash_traverse PARAMS ((struct bfd_hash_table *,
 \f
 /* User program access to BFD facilities */
 
+/* Direct I/O routines, for programs which know more about the object
+   file than BFD does.  Use higher level routines if possible.  */
+
+extern bfd_size_type bfd_read
+  PARAMS ((PTR, bfd_size_type size, bfd_size_type nitems, bfd *abfd));
+extern bfd_size_type bfd_write
+  PARAMS ((const PTR, bfd_size_type size, bfd_size_type nitems, bfd *abfd));
+extern int bfd_seek PARAMS ((bfd *abfd, const file_ptr fp, int direction));
+extern long bfd_tell PARAMS ((bfd *abfd));
+extern int bfd_flush PARAMS ((bfd *abfd));
+extern int bfd_stat PARAMS ((bfd *abfd, struct stat *));
+
 /* Cast from const char * to char * so that caller can assign to
    a char * without a warning.  */
 #define bfd_get_filename(abfd) ((char *) (abfd)->filename)
@@ -532,9 +545,11 @@ extern boolean bfd_elf32_record_link_assignment
 extern boolean bfd_elf64_record_link_assignment
   PARAMS ((bfd *, struct bfd_link_info *, const char *));
 extern boolean bfd_elf32_size_dynamic_sections
-  PARAMS ((bfd *, const char *, struct bfd_link_info *, struct sec **));
+  PARAMS ((bfd *, const char *, const char *, struct bfd_link_info *,
+          struct sec **));
 extern boolean bfd_elf64_size_dynamic_sections
-  PARAMS ((bfd *, const char *, struct bfd_link_info *, struct sec **));
+  PARAMS ((bfd *, const char *, const char *, struct bfd_link_info *,
+          struct sec **));
 extern void bfd_elf_set_dt_needed_name PARAMS ((bfd *, const char *));
 
 /* SunOS shared library support routines for the linker.  */
@@ -1842,6 +1857,9 @@ bfd_copy_private_bfd_data PARAMS ((bfd *ibfd, bfd *obfd));
 #define bfd_stat_arch_elt(abfd, stat) \
         BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat))
 
+#define bfd_update_armap_timestamp(abfd) \
+        BFD_SEND (abfd, _bfd_update_armap_timestamp, (abfd))
+
 #define bfd_set_arch_mach(abfd, arch, mach)\
         BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach))
 
@@ -2013,7 +2031,8 @@ CAT(NAME,_slurp_extended_name_table),\
 CAT(NAME,_truncate_arname),\
 CAT(NAME,_write_armap),\
 CAT(NAME,_openr_next_archived_file),\
-CAT(NAME,_generic_stat_arch_elt)
+CAT(NAME,_generic_stat_arch_elt),\
+CAT(NAME,_update_armap_timestamp)
   boolean  (*_bfd_slurp_armap) PARAMS ((bfd *));
   boolean  (*_bfd_slurp_extended_name_table) PARAMS ((bfd *));
   void     (*_bfd_truncate_arname) PARAMS ((bfd *, CONST char *, char *));
@@ -2022,9 +2041,10 @@ CAT(NAME,_generic_stat_arch_elt)
                               struct orl *map,
                               unsigned int orl_count, 
                               int stridx));
-  bfd *      (*openr_next_archived_file) PARAMS ((bfd *arch, bfd *prev));
-  int        (*_bfd_stat_arch_elt) PARAMS ((bfd *, struct stat *));
+  bfd *    (*openr_next_archived_file) PARAMS ((bfd *arch, bfd *prev));
+  int      (*_bfd_stat_arch_elt) PARAMS ((bfd *, struct stat *));
+  boolean  (*_bfd_update_armap_timestamp) PARAMS ((bfd *));
+
    /* Entry points used for symbols.  */
 #define BFD_JUMP_TABLE_SYMBOLS(NAME)\
 CAT(NAME,_get_symtab_upper_bound),\
index 5a2ef54..78ae323 100644 (file)
@@ -1211,16 +1211,18 @@ elf_fake_sections (abfd, asect, ignore)
       this_hdr->sh_type = SHT_DYNAMIC;
       this_hdr->sh_entsize = sizeof (Elf_External_Dyn);
     }
-  else if (strncmp (asect->name, ".rel.", 5) == 0)
-    {
-      this_hdr->sh_type = SHT_REL;
-      this_hdr->sh_entsize = sizeof (Elf_External_Rel);
-    }
-  else if (strncmp (asect->name, ".rela.", 6) == 0)
+  else if (strncmp (asect->name, ".rela", 5) == 0
+          && get_elf_backend_data (abfd)->use_rela_p)
     {
       this_hdr->sh_type = SHT_RELA;
       this_hdr->sh_entsize = sizeof (Elf_External_Rela);
     }
+  else if (strncmp (asect->name, ".rel", 4) == 0
+          && ! get_elf_backend_data (abfd)->use_rela_p)
+    {
+      this_hdr->sh_type = SHT_REL;
+      this_hdr->sh_entsize = sizeof (Elf_External_Rel);
+    }
   else if (strcmp (asect->name, ".note") == 0)
     this_hdr->sh_type = SHT_NOTE;
   else if (strncmp (asect->name, ".stab", 5) == 0
@@ -4857,8 +4859,10 @@ static const size_t elf_buckets[] =
    addresses of the various sections.  */
 
 boolean
-NAME(bfd_elf,size_dynamic_sections) (output_bfd, rpath, info, sinterpptr)
+NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath, info,
+                                    sinterpptr)
      bfd *output_bfd;
+     const char *soname;
      const char *rpath;
      struct bfd_link_info *info;
      asection **sinterpptr;
@@ -4933,6 +4937,16 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, rpath, info, sinterpptr)
 
   elf_hash_table (info)->bucketcount = bucketcount;
 
+  if (soname != NULL)
+    {
+      unsigned long indx;
+
+      indx = bfd_add_to_strtab (dynobj, elf_hash_table (info)->dynstr, soname);
+      if (indx == (unsigned long) -1
+         || ! elf_add_dynamic_entry (info, DT_SONAME, indx))
+       return false;
+    }      
+
   if (rpath != NULL)
     {
       unsigned long indx;