ld: Improve thin archive member error message

Improve thin archive member error message with:

ld: libbar.a(bar.o): error opening thin archive member: No such file or directory

instead of

ld: libbar.a: error adding symbols: No such file or directory

	PR ld/28722
	* archive.c (_bfd_get_elt_at_filepos): Add a pointer argument
	for struct bfd_link_info.  Call linker callback when failing to
	open thin archive member.
	(_bfd_generic_get_elt_at_index): Pass NULL to
	_bfd_get_elt_at_filepos.
	(bfd_generic_openr_next_archived_file): Likewise.
	* coff-alpha.c (alpha_ecoff_get_elt_at_filepos): Add a pointer
	argument for struct bfd_link_info and pass it to
	_bfd_get_elt_at_filepos.
	(alpha_ecoff_openr_next_archived_file): Pass NULL to
	_bfd_get_elt_at_filepos.
	(alpha_ecoff_get_elt_at_index): Likewise.
	* coff-rs6000.c (_bfd_xcoff_openr_next_archived_file): Likewise.
	* ecoff.c (ecoff_link_add_archive_symbols): Pass info to
	backend->get_elt_at_filepos.
	* elflink.c (elf_link_is_defined_archive_symbol): info to
	_bfd_get_elt_at_filepos.
	* libbfd-in.h (_bfd_get_elt_at_filepos): Add a pointer argument
	for struct bfd_link_info.
	* libbfd.h: Regenerate.
	* libecoff.h (ecoff_backend_data): Add a pointer argument for
	struct bfd_link_info to get_elt_at_filepos.
	* linker.c (_bfd_generic_link_add_archive_symbols): Pass info to
	_bfd_get_elt_at_filepos.
This commit is contained in:
H.J. Lu 2021-12-24 16:04:03 -08:00
parent 0b1e7ee5b5
commit 6395a10210
9 changed files with 44 additions and 18 deletions

View File

@ -651,7 +651,8 @@ _bfd_append_relative_path (bfd *arch, char *elt_name)
element, since it handles the bookkeeping so nicely for us. */
bfd *
_bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos)
_bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos,
struct bfd_link_info *info)
{
struct areltdata *new_areldata;
bfd *n_bfd;
@ -694,7 +695,8 @@ _bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos)
free (new_areldata);
return NULL;
}
n_bfd = _bfd_get_elt_at_filepos (ext_arch, new_areldata->origin);
n_bfd = _bfd_get_elt_at_filepos (ext_arch,
new_areldata->origin, info);
if (n_bfd == NULL)
{
free (new_areldata);
@ -715,8 +717,26 @@ _bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos)
open the external file as a bfd. */
bfd_set_error (bfd_error_no_error);
n_bfd = open_nested_file (filename, archive);
if (n_bfd == NULL && bfd_get_error () == bfd_error_no_error)
bfd_set_error (bfd_error_malformed_archive);
if (n_bfd == NULL)
{
switch (bfd_get_error ())
{
default:
break;
case bfd_error_no_error:
bfd_set_error (bfd_error_malformed_archive);
break;
case bfd_error_system_call:
if (info != NULL)
{
info->callbacks->einfo
(_("%F%P: %pB(%s): error opening thin archive member: %E\n"),
archive, filename);
break;
}
break;
}
}
}
else
{
@ -772,7 +792,7 @@ _bfd_generic_get_elt_at_index (bfd *abfd, symindex sym_index)
carsym *entry;
entry = bfd_ardata (abfd)->symdefs + sym_index;
return _bfd_get_elt_at_filepos (abfd, entry->file_offset);
return _bfd_get_elt_at_filepos (abfd, entry->file_offset, NULL);
}
bfd *
@ -841,7 +861,7 @@ bfd_generic_openr_next_archived_file (bfd *archive, bfd *last_file)
}
}
return _bfd_get_elt_at_filepos (archive, filestart);
return _bfd_get_elt_at_filepos (archive, filestart, NULL);
}
bfd *

View File

@ -2045,7 +2045,8 @@ alpha_ecoff_read_ar_hdr (bfd *abfd)
we uncompress the archive element if necessary. */
static bfd *
alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos)
alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos,
struct bfd_link_info *info)
{
bfd *nbfd = NULL;
struct areltdata *tdata;
@ -2057,7 +2058,7 @@ alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos)
ufile_ptr filesize;
buf = NULL;
nbfd = _bfd_get_elt_at_filepos (archive, filepos);
nbfd = _bfd_get_elt_at_filepos (archive, filepos, info);
if (nbfd == NULL)
goto error_return;
@ -2215,7 +2216,7 @@ alpha_ecoff_openr_next_archived_file (bfd *archive, bfd *last_file)
}
}
return alpha_ecoff_get_elt_at_filepos (archive, filestart);
return alpha_ecoff_get_elt_at_filepos (archive, filestart, NULL);
}
/* Open the archive file given an index into the armap. */
@ -2226,7 +2227,8 @@ alpha_ecoff_get_elt_at_index (bfd *abfd, symindex sym_index)
carsym *entry;
entry = bfd_ardata (abfd)->symdefs + sym_index;
return alpha_ecoff_get_elt_at_filepos (abfd, entry->file_offset);
return alpha_ecoff_get_elt_at_filepos (abfd, entry->file_offset,
NULL);
}
static void

View File

@ -1763,7 +1763,7 @@ _bfd_xcoff_openr_next_archived_file (bfd *archive, bfd *last_file)
}
}
return _bfd_get_elt_at_filepos (archive, filestart);
return _bfd_get_elt_at_filepos (archive, filestart, NULL);
}
/* Stat an element in an XCOFF archive. */

View File

@ -3639,7 +3639,9 @@ ecoff_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
hash = srch;
}
element = (*backend->get_elt_at_filepos) (abfd, (file_ptr) file_offset);
element = (*backend->get_elt_at_filepos) (abfd,
(file_ptr) file_offset,
info);
if (element == NULL)
return false;

View File

@ -3470,7 +3470,7 @@ elf_link_is_defined_archive_symbol (bfd * abfd, carsym * symdef)
Elf_Internal_Sym *isymend;
bool result;
abfd = _bfd_get_elt_at_filepos (abfd, symdef->file_offset);
abfd = _bfd_get_elt_at_filepos (abfd, symdef->file_offset, NULL);
if (abfd == NULL)
return false;
@ -5948,7 +5948,8 @@ elf_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
}
/* We need to include this archive member. */
element = _bfd_get_elt_at_filepos (abfd, symdef->file_offset);
element = _bfd_get_elt_at_filepos (abfd, symdef->file_offset,
info);
if (element == NULL)
goto error_return;

View File

@ -172,7 +172,7 @@ extern bool _bfd_write_archive_contents
extern bool _bfd_compute_and_write_armap
(bfd *, unsigned int) ATTRIBUTE_HIDDEN;
extern bfd *_bfd_get_elt_at_filepos
(bfd *, file_ptr) ATTRIBUTE_HIDDEN;
(bfd *, file_ptr, struct bfd_link_info *) ATTRIBUTE_HIDDEN;
extern bfd *_bfd_generic_get_elt_at_index
(bfd *, symindex) ATTRIBUTE_HIDDEN;
extern bfd * _bfd_new_bfd

View File

@ -177,7 +177,7 @@ extern bool _bfd_write_archive_contents
extern bool _bfd_compute_and_write_armap
(bfd *, unsigned int) ATTRIBUTE_HIDDEN;
extern bfd *_bfd_get_elt_at_filepos
(bfd *, file_ptr) ATTRIBUTE_HIDDEN;
(bfd *, file_ptr, struct bfd_link_info *) ATTRIBUTE_HIDDEN;
extern bfd *_bfd_generic_get_elt_at_index
(bfd *, symindex) ATTRIBUTE_HIDDEN;
extern bfd * _bfd_new_bfd

View File

@ -72,7 +72,7 @@ struct ecoff_backend_data
(bfd *, struct internal_filehdr *, struct internal_aouthdr *);
/* Read an element from an archive at a given file position. This
is needed because OSF/1 3.2 uses a weird archive format. */
bfd *(*get_elt_at_filepos) (bfd *, file_ptr);
bfd *(*get_elt_at_filepos) (bfd *, file_ptr, struct bfd_link_info *);
};
/* ECOFF targets don't support COFF long section names, so this

View File

@ -981,7 +981,8 @@ _bfd_generic_link_add_archive_symbols
if (last_ar_offset != arsym->file_offset)
{
last_ar_offset = arsym->file_offset;
element = _bfd_get_elt_at_filepos (abfd, last_ar_offset);
element = _bfd_get_elt_at_filepos (abfd, last_ar_offset,
info);
if (element == NULL
|| !bfd_check_format (element, bfd_object))
goto error_return;