Two small bug-fixes (affecting ar and nm).
authorPer Bothner <per@bothner.com>
Fri, 29 Nov 1991 20:31:57 +0000 (20:31 +0000)
committerPer Bothner <per@bothner.com>
Fri, 29 Nov 1991 20:31:57 +0000 (20:31 +0000)
bfd/ChangeLog
bfd/archive.c
bfd/syms.c

index 36934ba9ae992960bb56ac29d369e88e15bb0963..7172bf6449d7b8e9c18e47a5327c7292809ee107 100644 (file)
@@ -1,3 +1,10 @@
+Fri Nov 29 12:16:51 1991  Per Bothner  (bothner at cygnus.com)
+
+       * syms.c (bfd_decode_symclass):  Return 'A'
+       for symbols that are both absolute and global.
+       * archive.c (bfd_special_undocumented_glue):  Return NULL
+       if bfd_ar_hdr_from_filesystem returns NULL.
+
 Tue Nov 26 09:10:55 1991  Steve Chamberlain  (sac at cygnus.com)
 
        * Makefile.in: added coff-h8300
@@ -13,9 +20,6 @@ Tue Nov 26 09:10:55 1991  Steve Chamberlain  (sac at cygnus.com)
        handled, from the nest of #ifdefs to macros defined in the
        including coff-<foo>.c
 
-
-
-
 Fri Nov 22 08:11:42 1991  John Gilmore  (gnu at cygnus.com)
 
        * aoutx.h (some_aout_object_p):  Set the `executable' bit
index 17ee03bb76379ac311ec49ae414e27818202a91b..efd18a3f5b892f7db870380b1151e04e15fe9b7c 100644 (file)
@@ -827,8 +827,10 @@ DEFUN(bfd_special_undocumented_glue, (abfd, filename),
       bfd *abfd AND
       char *filename)
 {
-
-  return (struct ar_hdr *) bfd_ar_hdr_from_filesystem (abfd, filename) -> arch_header;
+  struct areltdata *ar_elt = bfd_ar_hdr_from_filesystem (abfd, filename);
+  if (ar_elt == NULL)
+      return NULL;
+  return (struct ar_hdr *) ar_elt->arch_header;
 }
 
 
@@ -1076,80 +1078,87 @@ compute_and_write_armap (arch, elength)
      bfd *arch;
      unsigned int elength;
 {
-  bfd *current;
-  file_ptr elt_no = 0;
-  struct orl *map;
-  int orl_max = 15000;         /* fine initial default */
-  int orl_count = 0;
-  int stridx = 0;              /* string index */
-
-  /* Dunno if this is the best place for this info... */
-  if (elength != 0) elength += sizeof (struct ar_hdr);
-  elength += elength %2 ;
-
-  map = (struct orl *) bfd_zalloc (arch,orl_max * sizeof (struct orl));
-  if (map == NULL) {
-    bfd_error = no_memory;
-    return false;
-  }
+    bfd *current;
+    file_ptr elt_no = 0;
+    struct orl *map;
+    int orl_max = 15000;       /* fine initial default */
+    int orl_count = 0;
+    int stridx = 0;            /* string index */
+
+    /* Dunno if this is the best place for this info... */
+    if (elength != 0) elength += sizeof (struct ar_hdr);
+    elength += elength %2 ;
+
+    map = (struct orl *) bfd_zalloc (arch,orl_max * sizeof (struct orl));
+    if (map == NULL) {
+           bfd_error = no_memory;
+           return false;
+       }
 
-  /* Map over each element */
-  for (current = arch->archive_head;
-       current != (bfd *)NULL;
-       current = current->next, elt_no++) 
-      {
+    /* Drop all the files called __.SYMDEF, we're going to make our
+       own */
+    while (arch->archive_head   &&
+          strcmp(arch->archive_head->filename,"__.SYMDEF") == 0) 
+    {
+       arch->archive_head = arch->archive_head->next;
+    }
+    /* Map over each element */
+    for (current = arch->archive_head;
+        current != (bfd *)NULL;
+        current = current->next, elt_no++) 
+    {
        if ((bfd_check_format (current, bfd_object) == true)
            && ((bfd_get_file_flags (current) & HAS_SYMS))) {
-         asymbol **syms;
-         unsigned int storage;
-         unsigned int symcount;
-         unsigned int src_count;
-
-         storage = get_symtab_upper_bound (current);
-         if (storage != 0) {
-
-           syms = (asymbol **) bfd_zalloc (arch,storage);
-           if (syms == NULL) {
-             bfd_error = no_memory; /* FIXME -- memory leak */
-             return false;
-           }
-           symcount = bfd_canonicalize_symtab (current, syms);
-
-
-           /* Now map over all the symbols, picking out the ones we want */
-           for (src_count = 0; src_count <symcount; src_count++) {
-             flagword flags = (syms[src_count])->flags;
-             if ((flags & BSF_GLOBAL) ||
-                 (flags & BSF_FORT_COMM)) {
-
-               /* This symbol will go into the archive header */
-               if (orl_count == orl_max) 
-                   {
-                     orl_max *= 2;
-                     map = (struct orl *) bfd_realloc (arch, (char *) map,
-                                                   orl_max * sizeof (struct orl));
+               asymbol **syms;
+               unsigned int storage;
+               unsigned int symcount;
+               unsigned int src_count;
+
+               storage = get_symtab_upper_bound (current);
+               if (storage != 0) {
+
+                       syms = (asymbol **) bfd_zalloc (arch,storage);
+                       if (syms == NULL) {
+                               bfd_error = no_memory; /* FIXME -- memory leak */
+                               return false;
+                           }
+                       symcount = bfd_canonicalize_symtab (current, syms);
+
+
+                       /* Now map over all the symbols, picking out the ones we want */
+                       for (src_count = 0; src_count <symcount; src_count++) {
+                               flagword flags = (syms[src_count])->flags;
+                               if ((flags & BSF_GLOBAL) ||
+                                   (flags & BSF_FORT_COMM)) {
+
+                                       /* This symbol will go into the archive header */
+                                       if (orl_count == orl_max) 
+                                       {
+                                           orl_max *= 2;
+                                           map = (struct orl *) bfd_realloc (arch, (char *) map,
+                                                                             orl_max * sizeof (struct orl));
+                                       }
+
+                                       (map[orl_count]).name = (char **) &((syms[src_count])->name);
+                                       (map[orl_count]).pos = (file_ptr) current;
+                                       (map[orl_count]).namidx = stridx;
+
+                                       stridx += strlen ((syms[src_count])->name) + 1;
+                                       ++orl_count;
+                                   }
+                           }
                    }
-
-               (map[orl_count]).name = (char **) &((syms[src_count])->name);
-               (map[orl_count]).pos = (file_ptr) current;
-               (map[orl_count]).namidx = stridx;
-
-               stridx += strlen ((syms[src_count])->name) + 1;
-               ++orl_count;
-             }
            }
-         }
-       }
-      }
-  /* OK, now we have collected all the data, let's write them out */
-  if (!BFD_SEND (arch, write_armap,
-                (arch, elength, map, orl_count, stridx))) {
+    }
+    /* OK, now we have collected all the data, let's write them out */
+    if (!BFD_SEND (arch, write_armap,
+                  (arch, elength, map, orl_count, stridx))) {
 
-    return false;
-  }
+           return false;
+       }
 
 
-  return true;
+    return true;
 }
 
 boolean
@@ -1157,7 +1166,7 @@ bsd_write_armap (arch, elength, map, orl_count, stridx)
      bfd *arch;
      unsigned int elength;
      struct orl *map;
-     int orl_count;
+     unsigned int orl_count;
      int stridx;
 {
   unsigned int ranlibsize = orl_count * sizeof (struct ranlib);
index f791c060a69d026d231117b4129e941f94705d73..c6a2b39f8cb1488265c87114840e23d803e31803 100644 (file)
@@ -383,16 +383,10 @@ asymbol *symbol)
 {
   flagword flags = symbol->flags;
   
-#if 0
-  if ((symbol->value == 0) && (symbol->section != NULL))
-    /* Huh?  All section names don't begin with "." */
-    return (symbol->section->name)[1];
-#endif
-
   if (flags & BSF_FORT_COMM) return 'C';
   if (flags & BSF_UNDEFINED) return 'U';
-  if (flags & BSF_ABSOLUTE)  return 'a';
-
+  if (flags & BSF_ABSOLUTE)
+       return (flags & BSF_GLOBAL) ? 'A' : 'a';
  
    if ( flags & (BSF_GLOBAL|BSF_LOCAL) ) {
      if (symbol->section == (asection *)NULL)