* 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.
This commit is contained in:
Geoffrey Keating 2000-08-16 00:34:19 +00:00
parent 0d10e18267
commit 31612ca61a
3 changed files with 67 additions and 30 deletions

View 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

View 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;
/* The symbol table starts with an eight byte count. */
c = bfd_h_get_64 (abfd, contents);
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);
}
/* 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);
/* After the file offsets come null terminated symbol names. */
cend = contents + sz;
for (i = 0, arsym = bfd_ardata (abfd)->symdefs;

View 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 */
}
}