xcoff dependency list for static libraries

Alan Modra amodra@gmail.com
Mon Nov 9 03:42:01 GMT 2020


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/archive.c b/bfd/archive.c
index 9d63849a48..1836b9b47e 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 48c583bfd0..5e5b182da9 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;

-- 
Alan Modra
Australia Development Lab, IBM


More information about the Binutils mailing list