version 1.1.1.1, 2016/01/26 17:25:58 |
version 1.1.1.2, 2016/10/26 17:02:28 |
|
|
/* MIPS-specific support for 64-bit ELF |
/* Support for 64-bit ELF archives. |
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007, |
Copyright (C) 1996-2015 Free Software Foundation, Inc. |
2010, 2012 Free Software Foundation, Inc. |
|
Ian Lance Taylor, Cygnus Support |
Ian Lance Taylor, Cygnus Support |
Linker support added by Mark Mitchell, CodeSourcery, LLC. |
Linker support added by Mark Mitchell, CodeSourcery, LLC. |
<mark@codesourcery.com> |
<mark@codesourcery.com> |
Line 47 bfd_elf64_archive_slurp_armap (bfd *abfd |
|
Line 46 bfd_elf64_archive_slurp_armap (bfd *abfd |
|
struct areltdata *mapdata; |
struct areltdata *mapdata; |
bfd_byte int_buf[8]; |
bfd_byte int_buf[8]; |
char *stringbase; |
char *stringbase; |
|
char *stringend; |
bfd_byte *raw_armap = NULL; |
bfd_byte *raw_armap = NULL; |
carsym *carsyms; |
carsym *carsyms; |
bfd_size_type amt; |
bfd_size_type amt; |
Line 77 bfd_elf64_archive_slurp_armap (bfd *abfd |
|
Line 77 bfd_elf64_archive_slurp_armap (bfd *abfd |
|
if (mapdata == NULL) |
if (mapdata == NULL) |
return FALSE; |
return FALSE; |
parsed_size = mapdata->parsed_size; |
parsed_size = mapdata->parsed_size; |
bfd_release (abfd, mapdata); |
free (mapdata); |
|
|
if (bfd_bread (int_buf, 8, abfd) != 8) |
if (bfd_bread (int_buf, 8, abfd) != 8) |
{ |
{ |
Line 93 bfd_elf64_archive_slurp_armap (bfd *abfd |
|
Line 93 bfd_elf64_archive_slurp_armap (bfd *abfd |
|
ptrsize = 8 * nsymz; |
ptrsize = 8 * nsymz; |
|
|
amt = carsym_size + stringsize + 1; |
amt = carsym_size + stringsize + 1; |
|
if (carsym_size < nsymz || ptrsize < nsymz || amt < nsymz) |
|
{ |
|
bfd_set_error (bfd_error_malformed_archive); |
|
return FALSE; |
|
} |
ardata->symdefs = (struct carsym *) bfd_zalloc (abfd, amt); |
ardata->symdefs = (struct carsym *) bfd_zalloc (abfd, amt); |
if (ardata->symdefs == NULL) |
if (ardata->symdefs == NULL) |
return FALSE; |
return FALSE; |
carsyms = ardata->symdefs; |
carsyms = ardata->symdefs; |
stringbase = ((char *) ardata->symdefs) + carsym_size; |
stringbase = ((char *) ardata->symdefs) + carsym_size; |
|
stringbase[stringsize] = 0; |
|
stringend = stringbase + stringsize; |
|
|
raw_armap = (bfd_byte *) bfd_alloc (abfd, ptrsize); |
raw_armap = (bfd_byte *) bfd_alloc (abfd, ptrsize); |
if (raw_armap == NULL) |
if (raw_armap == NULL) |
Line 115 bfd_elf64_archive_slurp_armap (bfd *abfd |
|
Line 122 bfd_elf64_archive_slurp_armap (bfd *abfd |
|
{ |
{ |
carsyms->file_offset = bfd_getb64 (raw_armap + i * 8); |
carsyms->file_offset = bfd_getb64 (raw_armap + i * 8); |
carsyms->name = stringbase; |
carsyms->name = stringbase; |
stringbase += strlen (stringbase) + 1; |
if (stringbase < stringend) |
|
stringbase += strlen (stringbase) + 1; |
++carsyms; |
++carsyms; |
} |
} |
*stringbase = '\0'; |
*stringbase = '\0'; |
Line 200 bfd_elf64_archive_write_armap (bfd *arch |
|
Line 208 bfd_elf64_archive_write_armap (bfd *arch |
|
current = current->archive_next) |
current = current->archive_next) |
{ |
{ |
/* For each symbol which is used defined in this object, write out |
/* For each symbol which is used defined in this object, write out |
the object file's address in the archive */ |
the object file's address in the archive. */ |
|
|
for (; |
for (; |
count < symbol_count && map[count].u.abfd == current; |
count < symbol_count && map[count].u.abfd == current; |
Line 210 bfd_elf64_archive_write_armap (bfd *arch |
|
Line 218 bfd_elf64_archive_write_armap (bfd *arch |
|
if (bfd_bwrite (buf, 8, arch) != 8) |
if (bfd_bwrite (buf, 8, arch) != 8) |
return FALSE; |
return FALSE; |
} |
} |
|
|
/* Add size of this archive entry */ |
/* Add size of this archive entry */ |
archive_member_file_ptr += (arelt_size (current) |
archive_member_file_ptr += sizeof (struct ar_hdr); |
+ sizeof (struct ar_hdr)); |
if (! bfd_is_thin_archive (arch)) |
|
archive_member_file_ptr += arelt_size (current); |
/* remember about the even alignment */ |
/* remember about the even alignment */ |
archive_member_file_ptr += archive_member_file_ptr % 2; |
archive_member_file_ptr += archive_member_file_ptr % 2; |
} |
} |