]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
PR 33385 vms archives
authorAlan Modra <amodra@gmail.com>
Sun, 7 Sep 2025 22:33:14 +0000 (08:03 +0930)
committerAlan Modra <amodra@gmail.com>
Mon, 8 Sep 2025 12:47:46 +0000 (22:17 +0930)
Commit 5c4ce239a3ab "Tidy bfdio to consistenly use containing archive"
broke vms archive handling, which has some horrible hacks involving
use of a special iovec for archive elements.  Modify the generic
archive handling code to not use the archive iovec when it differs
from the element iovec.

Also, various commits involving seek optimisation broke the vms
archive handling, which needs to see a rewind on an archive element.

* bfdio.c (bfd_read, bfd_write, bfd_tell, bfd_flush),
(bfd_stat, bfd_seek, bfd_mmap): Do not use the archive
bfd for IO when the archive and element iovec differ.
* plugin.c (bfd_plugin_open_input),
(bfd_plugin_close_file_descriptor): Likewise.
* vms-lib.c (vms_lib_bopen): Force bfd_seek to call iovec seek.

bfd/bfdio.c
bfd/plugin.c
bfd/vms-lib.c

index 7063bcc1ae68ef93dd2610970772cea12387cf18..6788caf19172b43520d6bc019ffb95f8c52b60a7 100644 (file)
@@ -328,6 +328,7 @@ bfd_read (void *ptr, bfd_size_type size, bfd *abfd)
   ufile_ptr offset = 0;
 
   while (abfd->my_archive != NULL
+        && abfd->my_archive->iovec == abfd->iovec
         && !bfd_is_thin_archive (abfd->my_archive))
     {
       offset += abfd->origin;
@@ -339,6 +340,7 @@ bfd_read (void *ptr, bfd_size_type size, bfd *abfd)
      this element.  */
   if (element_bfd->arelt_data != NULL
       && element_bfd->my_archive != NULL
+      && element_bfd->my_archive->iovec == element_bfd->iovec
       && !bfd_is_thin_archive (element_bfd->my_archive))
     {
       bfd_size_type maxbytes = arelt_size (element_bfd);
@@ -392,6 +394,7 @@ bfd_write (const void *ptr, bfd_size_type size, bfd *abfd)
   file_ptr nwrote;
 
   while (abfd->my_archive != NULL
+        && abfd->my_archive->iovec == abfd->iovec
         && !bfd_is_thin_archive (abfd->my_archive))
     abfd = abfd->my_archive;
 
@@ -440,6 +443,7 @@ bfd_tell (bfd *abfd)
   file_ptr ptr;
 
   while (abfd->my_archive != NULL
+        && abfd->my_archive->iovec == abfd->iovec
         && !bfd_is_thin_archive (abfd->my_archive))
     {
       offset += abfd->origin;
@@ -470,6 +474,7 @@ int
 bfd_flush (bfd *abfd)
 {
   while (abfd->my_archive != NULL
+        && abfd->my_archive->iovec == abfd->iovec
         && !bfd_is_thin_archive (abfd->my_archive))
     abfd = abfd->my_archive;
 
@@ -497,6 +502,7 @@ bfd_stat (bfd *abfd, struct stat *statbuf)
   int result;
 
   while (abfd->my_archive != NULL
+        && abfd->my_archive->iovec == abfd->iovec
         && !bfd_is_thin_archive (abfd->my_archive))
     abfd = abfd->my_archive;
 
@@ -531,6 +537,7 @@ bfd_seek (bfd *abfd, file_ptr position, int direction)
   ufile_ptr offset = 0;
 
   while (abfd->my_archive != NULL
+        && abfd->my_archive->iovec == abfd->iovec
         && !bfd_is_thin_archive (abfd->my_archive))
     {
       offset += abfd->origin;
@@ -734,6 +741,7 @@ bfd_mmap (bfd *abfd, void *addr, size_t len,
          void **map_addr, size_t *map_len)
 {
   while (abfd->my_archive != NULL
+        && abfd->my_archive->iovec == abfd->iovec
         && !bfd_is_thin_archive (abfd->my_archive))
     {
       offset += abfd->origin;
index 5e5a0b70a04174d143869dc6c72136ae25f23b58..f8ddc616724ad316edf03ff28cbd62e2c085129a 100644 (file)
@@ -378,6 +378,7 @@ bfd_plugin_open_input (bfd *ibfd, struct ld_plugin_input_file *file)
 
   iobfd = ibfd;
   while (iobfd->my_archive
+        && iobfd->my_archive->iovec == iobfd->iovec
         && !bfd_is_thin_archive (iobfd->my_archive))
     iobfd = iobfd->my_archive;
   file->name = bfd_get_filename (iobfd);
@@ -470,6 +471,7 @@ bfd_plugin_close_file_descriptor (bfd *abfd, int fd)
   else
     {
       while (abfd->my_archive
+            && abfd->my_archive->iovec == abfd->iovec
             && !bfd_is_thin_archive (abfd->my_archive))
        abfd = abfd->my_archive;
 
index 659832cf322084e9c85b671871ce75069127aff3..1206d7e24d45eb51bff423655fa536842e970055 100644 (file)
@@ -1304,6 +1304,10 @@ vms_lib_bopen (bfd *el, file_ptr filepos)
   el->iostream = vec;
   el->iovec = &vms_lib_iovec;
 
+  /* Force the next rewind to call vms_lib_bseek even though it will
+     appear to bfd_seek that the file position is already at 0.  */
+  el->last_io = bfd_io_force;
+
   /* File length is not known.  */
   vec->file_len = -1;