* xcofflink.c (_bfd_ppc_xcoff_relocate_section): Add ori r0,r0,0
authorGeoffrey Keating <geoffk@geoffk.org>
Wed, 16 Aug 2000 00:34:19 +0000 (00:34 +0000)
committerGeoffrey Keating <geoffk@geoffk.org>
Wed, 16 Aug 2000 00:34:19 +0000 (00:34 +0000)
to the list of NOPs we recognize after a branch-and-link.
Use the ori NOP when one is needed.

* coff-rs6000.c (_bfd_xcoff_slurp_armap): Finish implementation
for large archives.

bfd/ChangeLog
bfd/coff-rs6000.c
bfd/xcofflink.c

index f58853d55fda31ffa242a40137851a522809d0b4..c25b13984a6d8b39349fe4c37e1c05d3d319fc4f 100644 (file)
@@ -1,3 +1,12 @@
+2000-08-15  Geoffrey Keating  <geoffk@cygnus.com>
+
+       * xcofflink.c (_bfd_ppc_xcoff_relocate_section): Add ori r0,r0,0
+       to the list of NOPs we recognize after a branch-and-link.
+       Use the ori NOP when one is needed.
+
+       * coff-rs6000.c (_bfd_xcoff_slurp_armap): Finish implementation
+       for large archives.
+
 2000-08-14  Jim Wilson  <wilson@cygnus.com>
 
        * elf64-ia64.c (elf64_ia64_merge_private_bfd_data): Handle
index d3332d2dd1028f7f7cbba808547727aaccc63a21..dec690ce4895f237828fad3e4e37925b10b7b8c0 100644 (file)
@@ -1098,7 +1098,7 @@ _bfd_xcoff_slurp_armap (abfd)
   size_t namlen;
   bfd_size_type sz;
   bfd_byte *contents, *cend;
-  unsigned int c, i;
+  bfd_vma c, i;
   carsym *arsym;
   bfd_byte *p;
 
@@ -1133,6 +1133,33 @@ _bfd_xcoff_slurp_armap (abfd)
        return false;
 
       sz = strtol (hdr.size, (char **) NULL, 10);
+
+      /* Read in the entire symbol table.  */
+      contents = (bfd_byte *) bfd_alloc (abfd, sz);
+      if (contents == NULL)
+       return false;
+      if (bfd_read ((PTR) contents, 1, sz, abfd) != sz)
+       return false;
+
+      /* The symbol table starts with a four byte count.  */
+      c = bfd_h_get_32 (abfd, contents);
+      
+      if (c * 4 >= sz)
+       {
+         bfd_set_error (bfd_error_bad_value);
+         return false;
+       }
+      
+      bfd_ardata (abfd)->symdefs = ((carsym *)
+                                   bfd_alloc (abfd, c * sizeof (carsym)));
+      if (bfd_ardata (abfd)->symdefs == NULL)
+       return false;
+      
+      /* After the count comes a list of four byte file offsets.  */
+      for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 4;
+          i < c;
+          ++i, ++arsym, p += 4)
+       arsym->file_offset = bfd_h_get_32 (abfd, p);
     }
   else
     {
@@ -1163,35 +1190,35 @@ _bfd_xcoff_slurp_armap (abfd)
         machines) since the field width is 20 and there numbers with more
         than 32 bits can be represented.  */
       sz = strtol (hdr.size, (char **) NULL, 10);
-    }
 
-  /* Read in the entire symbol table.  */
-  contents = (bfd_byte *) bfd_alloc (abfd, sz);
-  if (contents == NULL)
-    return false;
-  if (bfd_read ((PTR) contents, 1, sz, abfd) != sz)
-    return false;
+      /* Read in the entire symbol table.  */
+      contents = (bfd_byte *) bfd_alloc (abfd, sz);
+      if (contents == NULL)
+       return false;
+      if (bfd_read ((PTR) contents, 1, sz, abfd) != sz)
+       return false;
 
-  /* The symbol table starts with a four byte count.  */
-  c = bfd_h_get_32 (abfd, contents);
+      /* The symbol table starts with an eight byte count.  */
+      c = bfd_h_get_64 (abfd, contents);
 
-  if (c * 4 >= sz)
-    {
-      bfd_set_error (bfd_error_bad_value);
-      return false;
+      if (c * 8 >= sz)
+       {
+         bfd_set_error (bfd_error_bad_value);
+         return false;
+       }
+      
+      bfd_ardata (abfd)->symdefs = ((carsym *)
+                                   bfd_alloc (abfd, c * sizeof (carsym)));
+      if (bfd_ardata (abfd)->symdefs == NULL)
+       return false;
+      
+      /* After the count comes a list of eight byte file offsets.  */
+      for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 8;
+          i < c;
+          ++i, ++arsym, p += 8)
+       arsym->file_offset = bfd_h_get_64 (abfd, p);
     }
 
-  bfd_ardata (abfd)->symdefs = ((carsym *)
-                               bfd_alloc (abfd, c * sizeof (carsym)));
-  if (bfd_ardata (abfd)->symdefs == NULL)
-    return false;
-
-  /* After the count comes a list of four byte file offsets.  */
-  for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 4;
-       i < c;
-       ++i, ++arsym, p += 4)
-    arsym->file_offset = bfd_h_get_32 (abfd, p);
-
   /* After the file offsets come null terminated symbol names.  */
   cend = contents + sz;
   for (i = 0, arsym = bfd_ardata (abfd)->symdefs;
index 2d03fa425dc4355edfe2138cc3e6f8ab97fb2008..f518fdfb1a413a77bdbd71cd2992a0f169399610 100644 (file)
@@ -6577,13 +6577,14 @@ _bfd_ppc_xcoff_relocate_section (output_bfd, info, input_bfd,
              || strcmp (h->root.root.string, "._ptrgl") == 0)
            {
              if (next == 0x4def7b82            /* cror 15,15,15 */
-                 || next == 0x4ffffb82)        /* cror 31,31,31 */
+                 || next == 0x4ffffb82         /* cror 31,31,31 */
+                 || next == 0x60000000)        /* ori r0,r0,0 */
                bfd_put_32 (input_bfd, 0x80410014, pnext); /* lwz r1,20(r1) */
            }
          else
            {
              if (next == 0x80410014)           /* lwz r1,20(r1) */
-               bfd_put_32 (input_bfd, 0x4ffffb82, pnext); /* cror 31,31,31 */
+               bfd_put_32 (input_bfd, 0x60000000, pnext); /* ori r0,r0,0 */
            }
        }