From: Alan Modra Date: Mon, 9 Nov 2020 02:34:04 +0000 (+1030) Subject: xcoff dependency list for static libraries X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=904790e24f4a332d0eedf302e417d0f16625f12f;p=binutils-gdb.git xcoff dependency list for static libraries This patch fixes fails adding library dependencies for xcoff, and improves the error message should stat fail for an archive member. "tmpdir/artest.a: File not found" is plainly wrong. Fixes these fails: powerpc-aix5.1 +FAIL: ar adding library dependencies powerpc-aix5.2 +FAIL: ar adding library dependencies rs6000-aix4.3.3 +FAIL: ar adding library dependencies rs6000-aix5.1 +FAIL: ar adding library dependencies rs6000-aix5.2 +FAIL: ar adding library dependencies * archive.c (bfd_ar_hdr_from_filesystem): Use bfd_set_input_error when stat of archive member fails. * coff-rs6000.c (xcoff_write_archive_contents_old), (xcoff_write_archive_contents_big): Likewise, and handle in-memory bfd. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 5ba165075cb..0d1d63d5fed 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2020-11-09 Alan Modra + + * archive.c (bfd_ar_hdr_from_filesystem): Use bfd_set_input_error + when stat of archive member fails. + * coff-rs6000.c (xcoff_write_archive_contents_old), + (xcoff_write_archive_contents_big): Likewise, and handle in-memory + bfd. + 2020-11-03 Alan Modra * elf.c (bfd_section_from_shdr): Free sections_being_created. diff --git a/bfd/archive.c b/bfd/archive.c index 9d63849a483..1836b9b47e2 100644 --- a/bfd/archive.c +++ b/bfd/archive.c @@ -1875,7 +1875,7 @@ bfd_ar_hdr_from_filesystem (bfd *abfd, const char *filename, bfd *member) } else if (stat (filename, &status) != 0) { - bfd_set_error (bfd_error_system_call); + bfd_set_input_error (member, bfd_error_system_call); return NULL; } diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c index 48c583bfd02..5e5b182da9c 100644 --- a/bfd/coff-rs6000.c +++ b/bfd/coff-rs6000.c @@ -2096,11 +2096,23 @@ xcoff_write_archive_contents_old (bfd *abfd) struct xcoff_ar_hdr *ahdrp; struct stat s; - if (stat (bfd_get_filename (sub), &s) != 0) + if ((sub->flags & BFD_IN_MEMORY) != 0) { - bfd_set_error (bfd_error_system_call); + /* Assume we just "made" the member, and fake it. */ + struct bfd_in_memory *bim + = (struct bfd_in_memory *) sub->iostream; + time (&s.st_mtime); + s.st_uid = getuid (); + s.st_gid = getgid (); + s.st_mode = 0644; + s.st_size = bim->size; + } + else if (stat (bfd_get_filename (sub), &s) != 0) + { + bfd_set_input_error (sub, bfd_error_system_call); return FALSE; } + if ((abfd->flags & BFD_DETERMINISTIC_OUTPUT) != 0) { s.st_mtime = 0; @@ -2320,14 +2332,23 @@ xcoff_write_archive_contents_big (bfd *abfd) struct xcoff_ar_hdr_big *ahdrp; struct stat s; - /* XXX This should actually be a call to stat64 (at least on - 32-bit machines). - XXX This call will fail if the original object is not found. */ - if (stat (bfd_get_filename (current_bfd), &s) != 0) + if ((current_bfd->flags & BFD_IN_MEMORY) != 0) { - bfd_set_error (bfd_error_system_call); + /* Assume we just "made" the member, and fake it. */ + struct bfd_in_memory *bim + = (struct bfd_in_memory *) current_bfd->iostream; + time (&s.st_mtime); + s.st_uid = getuid (); + s.st_gid = getgid (); + s.st_mode = 0644; + s.st_size = bim->size; + } + else if (stat (bfd_get_filename (current_bfd), &s) != 0) + { + bfd_set_input_error (current_bfd, bfd_error_system_call); return FALSE; } + if ((abfd->flags & BFD_DETERMINISTIC_OUTPUT) != 0) { s.st_mtime = 0;