* Better long-filename handling. Reads SOM ABI compliant extended
authorJeff Law <law@redhat.com>
Sat, 19 Mar 1994 02:17:15 +0000 (02:17 +0000)
committerJeff Law <law@redhat.com>
Sat, 19 Mar 1994 02:17:15 +0000 (02:17 +0000)
        names, but doesn't quite write compliant extended names yet.
        * som.c (som_slurp_extended_name_table): Delete function.  The
        generic code will handle things correctly.
        (som_slurp_armap): Seek to the beginning of the next member.
        (normalize): New function.
        (som_bfd_ar_write_symbol_stuff): Take the size of the extended
        name table into account when computing the file offsets in the
        SOM dictionary.  Make sure to align to an even boundary.
        (som_write_armap): Initialize the checksum to zero.
        (ar_maxchars): Fix.  Opps.

bfd/ChangeLog
bfd/som.c

index 8801ce7c929dfb9b236fff40ff7aca9a12cd68cf..e37ff15661424db87186d347116c99d1033d8672 100644 (file)
@@ -1,3 +1,17 @@
+Fri Mar 18 18:13:49 1994  Jeffrey A. Law  (law@snake.cs.utah.edu)
+
+        * Better long-filename handling.  Reads SOM ABI compliant extended
+       names, but doesn't quite write compliant extended names yet.
+       * som.c (som_slurp_extended_name_table): Delete function.  The
+       generic code will handle things correctly.
+       (som_slurp_armap): Seek to the beginning of the next member.
+       (normalize): New function.
+       (som_bfd_ar_write_symbol_stuff): Take the size of the extended
+       name table into account when computing the file offsets in the
+       SOM dictionary.  Make sure to align to an even boundary.
+       (som_write_armap): Initialize the checksum to zero.
+       (ar_maxchars): Fix.  Opps.
+
 Fri Mar 18 20:35:24 1994  Ken Raeburn  (raeburn@cujo.cygnus.com)
 
        * aoutx.h (reloc_type_lookup): Handle BFD_RELOC_CTOR on a 64-bit
index e18f76a87155e71d1a39a46fc8e4fdb0b5fd3aca..92b2e6fd4784f397b316c523cd04126fc2adf400 100644 (file)
--- a/bfd/som.c
+++ b/bfd/som.c
@@ -216,7 +216,6 @@ static boolean som_bfd_fill_in_ar_symbols PARAMS ((bfd *, struct lst_header *,
                                                   carsym **syms));
 static boolean som_slurp_armap PARAMS ((bfd *));
 static boolean som_write_armap PARAMS ((bfd *));
-static boolean som_slurp_extended_name_table PARAMS ((bfd *));
 static void som_bfd_derive_misc_symbol_info PARAMS ((bfd *, asymbol *,
                                             struct som_misc_symbol_info *));
 static boolean som_bfd_prep_for_ar_write PARAMS ((bfd *, unsigned int *,
@@ -225,6 +224,7 @@ static unsigned int som_bfd_ar_symbol_hash PARAMS ((asymbol *));
 static boolean som_bfd_ar_write_symbol_stuff PARAMS ((bfd *, unsigned int,
                                                      unsigned int,
                                                      struct lst_header));
+static CONST char *normalize PARAMS ((CONST char *file));
        
 /* Map SOM section names to POSIX/BSD single-character symbol types.
 
@@ -4724,6 +4724,14 @@ som_slurp_armap (abfd)
       == false)
     return false;
 
+  /* Seek back to the "first" file in the archive.  Note the "first"
+     file may be the extended name table.  */
+  if (bfd_seek (abfd, ardata->first_file_filepos, SEEK_SET) < 0)
+    {
+      bfd_set_error (bfd_error_system_call);
+      return false;
+    }
+
   /* Notify the generic archive code that we have a symbol map.  */
   bfd_has_map (abfd) = true;
   return true;
@@ -4813,6 +4821,19 @@ som_bfd_ar_symbol_hash (symbol)
          | (symbol->name[len-2] << 8) | symbol->name[len-1];
 }
 
+static CONST char *
+normalize (file)
+     CONST char *file;
+{
+  CONST char *filename = strrchr (file, '/');
+
+  if (filename != NULL)
+    filename++;
+  else
+    filename = file;
+  return filename;
+}
+
 /* Do the bulk of the work required to write the SOM library
    symbol table.  */
    
@@ -4825,11 +4846,12 @@ som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst)
   file_ptr lst_filepos;
   char *strings = NULL, *p;
   struct lst_symbol_record *lst_syms = NULL, *curr_lst_sym;
-  bfd *curr_bfd = abfd->archive_head;
+  bfd *curr_bfd;
   unsigned int *hash_table = NULL;
   struct som_entry *som_dict = NULL;
   struct lst_symbol_record **last_hash_entry = NULL;
-  unsigned int curr_som_offset, som_index;
+  unsigned int curr_som_offset, som_index, extended_name_length = 0;
+  unsigned int maxname = abfd->xvec->ar_max_namelen;
 
   hash_table =
     (unsigned int *) malloc (lst.hash_size * sizeof (unsigned int));
@@ -4876,6 +4898,33 @@ som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst)
   som_index = 0;
   curr_som_offset = 8 + 2 * sizeof (struct ar_hdr) + lst.file_end;
 
+  /* Yow!  We have to know the size of the extended name table
+     too.  */
+  for (curr_bfd = abfd->archive_head;
+       curr_bfd != NULL;
+       curr_bfd = curr_bfd->next)
+    {
+      CONST char *normal = normalize (curr_bfd->filename);
+      unsigned int thislen;
+
+      if (!normal)
+       {
+         bfd_set_error (bfd_error_no_memory);
+         return false;
+       }
+      thislen = strlen (normal);
+      if (thislen > maxname)
+       extended_name_length += thislen + 1;
+    }
+
+  /* Make room for the archive header and the contents of the
+     extended string table.  */
+  if (extended_name_length)
+    curr_som_offset += extended_name_length + sizeof (struct ar_hdr);
+
+  /* Make sure we're properly aligned.  */
+  curr_som_offset = (curr_som_offset + 0x1) & ~0x1;
+
   /* FIXME should be done with buffers just like everything else... */
   lst_syms = malloc (nsyms * sizeof (struct lst_symbol_record));
   if (lst_syms == NULL && nsyms != 0)
@@ -4893,7 +4942,7 @@ som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst)
   p = strings;
   curr_lst_sym = lst_syms;
 
-
+  curr_bfd = abfd->archive_head;
   while (curr_bfd != NULL)
     {
       unsigned int curr_count, i;
@@ -5149,12 +5198,12 @@ som_write_armap (abfd)
 
   /* SOM ABI says this must be zero.  */
   lst.free_list = 0;
-
   lst.file_end = lst_size;
 
   /* Compute the checksum.  Must happen after the entire lst header
      has filled in.  */
   p = (int *)&lst;
+  lst.checksum = 0;
   for (i = 0; i < sizeof (struct lst_header)/sizeof (int) - 1; i++)
     lst.checksum ^= *p++;
 
@@ -5196,16 +5245,6 @@ som_write_armap (abfd)
   return true;
 }
 
-/* Apparently the extened names are never used, even though they appear
-   in the SOM ABI.  Hmmm.  */
-static boolean
-som_slurp_extended_name_table (abfd)
-     bfd *abfd;
-{
-  bfd_ardata (abfd)->extended_names = NULL;
-  return true;
-}
-
 /* End of miscellaneous support functions. */
 
 #define som_bfd_debug_info_start        bfd_void
@@ -5215,6 +5254,7 @@ som_slurp_extended_name_table (abfd)
 #define som_openr_next_archived_file   bfd_generic_openr_next_archived_file
 #define som_generic_stat_arch_elt      bfd_generic_stat_arch_elt
 #define som_truncate_arname            bfd_bsd_truncate_arname
+#define som_slurp_extended_name_table  _bfd_slurp_extended_name_table
 
 #define som_get_lineno                   (struct lineno_cache_entry *(*)())bfd_nullvoidptr
 #define        som_close_and_cleanup              bfd_generic_close_and_cleanup
@@ -5253,7 +5293,7 @@ bfd_target som_vec =
    predictable, and if so what is it */
   0,
   '/',                         /* ar_pad_char */
-  16,                          /* ar_max_namelen */
+  14,                          /* ar_max_namelen */
   3,                           /* minimum alignment */
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,