X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=bfd%2Farchive.c;h=dc0400d1cf6bbbe00ca86eb41e066755a04ac901;hb=fd3619828e94a24a92cddec42cbc0ab33352eeb4;hp=0a7da3a0cb9c839657aa615107abc67d2d103800;hpb=cc5277b173701364c10204f316db28198f2c683b;p=binutils-gdb.git diff --git a/bfd/archive.c b/bfd/archive.c index 0a7da3a0cb9..dc0400d1cf6 100644 --- a/bfd/archive.c +++ b/bfd/archive.c @@ -692,6 +692,13 @@ _bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos) return NULL; } n_bfd->proxy_origin = bfd_tell (archive); + + /* Copy BFD_COMPRESS, BFD_DECOMPRESS and BFD_COMPRESS_GABI + flags. */ + n_bfd->flags |= archive->flags & (BFD_COMPRESS + | BFD_DECOMPRESS + | BFD_COMPRESS_GABI); + return n_bfd; } @@ -721,7 +728,9 @@ _bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos) else { n_bfd->origin = n_bfd->proxy_origin; - n_bfd->filename = xstrdup (filename); + n_bfd->filename = bfd_strdup (filename); + if (n_bfd->filename == NULL) + goto out; } n_bfd->arelt_data = new_areldata; @@ -734,11 +743,14 @@ _bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos) /* Copy is_linker_input. */ n_bfd->is_linker_input = archive->is_linker_input; - if (_bfd_add_bfd_to_archive_cache (archive, filepos, n_bfd)) + if (archive->no_element_cache + || _bfd_add_bfd_to_archive_cache (archive, filepos, n_bfd)) return n_bfd; + out: free (new_areldata); n_bfd->arelt_data = NULL; + bfd_close (n_bfd); return NULL; } @@ -885,6 +897,7 @@ bfd_generic_archive_p (bfd *abfd) if (abfd->target_defaulted && bfd_has_map (abfd)) { bfd *first; + unsigned int save; /* This archive has a map, so we may presume that the contents are object files. Make sure that if the first file in the @@ -897,14 +910,17 @@ bfd_generic_archive_p (bfd *abfd) normal archive, regardless of the format of the object files. We do accept an empty archive. */ + save = abfd->no_element_cache; + abfd->no_element_cache = 1; first = bfd_openr_next_archived_file (abfd, NULL); + abfd->no_element_cache = save; if (first != NULL) { first->target_defaulted = FALSE; if (bfd_check_format (first, bfd_object) && first->xvec != abfd->xvec) bfd_set_error (bfd_error_wrong_object_format); - /* And we ought to close `first' here too. */ + bfd_close (first); } } @@ -974,7 +990,6 @@ do_slurp_bsd_armap (bfd *abfd) goto byebye; } - ardata->cache = 0; rbase = raw_armap + BSD_SYMDEF_COUNT_SIZE; stringbase = ((char *) rbase + ardata->symdef_count * BSD_SYMDEF_SIZE @@ -998,7 +1013,7 @@ do_slurp_bsd_armap (bfd *abfd) /* FIXME, we should provide some way to free raw_ardata when we are done using the strings from it. For now, it seems to be allocated on an objalloc anyway... */ - bfd_has_map (abfd) = TRUE; + abfd->has_armap = TRUE; return TRUE; } @@ -1090,7 +1105,7 @@ do_slurp_coff_armap (bfd *abfd) /* Pad to an even boundary if you have to. */ ardata->first_file_filepos += (ardata->first_file_filepos) % 2; - bfd_has_map (abfd) = TRUE; + abfd->has_armap = TRUE; bfd_release (abfd, raw_armap); /* Check for a second archive header (as used by PE). */ @@ -1173,7 +1188,7 @@ bfd_slurp_armap (bfd *abfd) return do_slurp_bsd_armap (abfd); } - bfd_has_map (abfd) = FALSE; + abfd->has_armap = FALSE; return TRUE; }