]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
bfd/COFF: optionally pass BFD section into swap_scnhdr_out() hook
authorJan Beulich <jbeulich@suse.com>
Fri, 10 Oct 2025 13:58:55 +0000 (15:58 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 10 Oct 2025 13:58:55 +0000 (15:58 +0200)
_bfd_XXi_swap_scnhdr_out() will want to use the section's flags. Some
call sites don't have a BFD section available, and hence pass NULL. Code
using the parameter will therefore need to apply appropriate care.

bfd/coff-go32.c
bfd/coff-rs6000.c
bfd/coff-stgo32.c
bfd/coff64-rs6000.c
bfd/coffcode.h
bfd/coffswap.h
bfd/ecoff.c
bfd/libcoff.h
bfd/libpei.h
bfd/peXXigen.c

index 9922e73a9e6427290a799f0e5232211e6071e520..f50e0b920ee91080578033b3485f9d2d25dd485f 100644 (file)
@@ -61,7 +61,7 @@
    used for coff-go32-exe (coff-stgo32.c).  */
 bool _bfd_go32_mkobject (bfd *);
 void _bfd_go32_swap_scnhdr_in (bfd *, void *, void *);
-unsigned int _bfd_go32_swap_scnhdr_out (bfd *, void *, void *);
+unsigned int _bfd_go32_swap_scnhdr_out (bfd *, void *, void *, const asection *);
 
 #define coff_mkobject _bfd_go32_mkobject
 #define coff_SWAP_scnhdr_in _bfd_go32_swap_scnhdr_in
@@ -119,7 +119,8 @@ _bfd_go32_swap_scnhdr_in (bfd * abfd, void * ext, void * in)
 }
 
 unsigned int
-_bfd_go32_swap_scnhdr_out (bfd * abfd, void * in, void * out)
+_bfd_go32_swap_scnhdr_out (bfd *abfd, void *in, void *out,
+                          const asection *section ATTRIBUTE_UNUSED)
 {
   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
   SCNHDR *scnhdr_ext = (SCNHDR *) out;
index 3c18518b0c81d07895a63acdf16cf7daa564199d..803b51c9fc3c774b42b5a7322e1d4af2532125b2 100644 (file)
@@ -4352,7 +4352,7 @@ xcoff_generate_rtinit  (bfd *abfd, const char *init, const char *fini,
   filehdr.f_symptr = scnhdr.s_relptr + scnhdr.s_nreloc * RELSZ;
 
   bfd_coff_swap_filehdr_out (abfd, &filehdr, filehdr_ext);
-  bfd_coff_swap_scnhdr_out (abfd, &scnhdr, scnhdr_ext);
+  bfd_coff_swap_scnhdr_out (abfd, &scnhdr, scnhdr_ext, NULL);
   bool ret = true;
   if (bfd_write (filehdr_ext, FILHSZ, abfd) != FILHSZ
       || bfd_write (scnhdr_ext, SCNHSZ, abfd) != SCNHSZ
index e2ff900f66891a11ff85a5f5e944c36d07f7530b..f6ed2427c1c72ecda452f31b50c5e00b19610245 100644 (file)
@@ -61,7 +61,7 @@ static bool go32exe_copy_private_bfd_data (bfd *, bfd *);
 /* Defined in coff-go32.c.  */
 bool _bfd_go32_mkobject (bfd *);
 void _bfd_go32_swap_scnhdr_in (bfd *, void *, void *);
-unsigned int _bfd_go32_swap_scnhdr_out (bfd *, void *, void *);
+unsigned int _bfd_go32_swap_scnhdr_out (bfd *, void *, void *, const asection *);
 
 #define COFF_CHECK_FORMAT go32exe_check_format
 #define COFF_WRITE_CONTENTS go32exe_write_object_contents
index d335348c19650c990b0b25febbaeb6e82313128a..814d25eda90863df22ba2ad0e648529dd96ce321 100644 (file)
@@ -2377,9 +2377,9 @@ xcoff64_generate_rtinit (bfd *abfd, const char *init, const char *fini,
   filehdr.f_symptr = data_scnhdr.s_relptr + data_scnhdr.s_nreloc * RELSZ;
 
   bfd_coff_swap_filehdr_out (abfd, &filehdr, filehdr_ext);
-  bfd_coff_swap_scnhdr_out (abfd, &text_scnhdr, &scnhdr_ext[SCNHSZ * 0]);
-  bfd_coff_swap_scnhdr_out (abfd, &data_scnhdr, &scnhdr_ext[SCNHSZ * 1]);
-  bfd_coff_swap_scnhdr_out (abfd, &bss_scnhdr, &scnhdr_ext[SCNHSZ * 2]);
+  bfd_coff_swap_scnhdr_out (abfd, &text_scnhdr, &scnhdr_ext[SCNHSZ * 0], NULL);
+  bfd_coff_swap_scnhdr_out (abfd, &data_scnhdr, &scnhdr_ext[SCNHSZ * 1], NULL);
+  bfd_coff_swap_scnhdr_out (abfd, &bss_scnhdr, &scnhdr_ext[SCNHSZ * 2], NULL);
   bool ret = true;
   if (bfd_write (filehdr_ext, FILHSZ, abfd) != FILHSZ
       || bfd_write (scnhdr_ext, 3 * SCNHSZ, abfd) != 3 * SCNHSZ
index a466af19736ef9941e8f739cf0ced731c1143024..7de6a93f904cae98d63ec778e1e88a846a61fb5c 100644 (file)
@@ -1432,7 +1432,7 @@ CODE_FRAGMENT
 .    (bfd *, void *, void *);
 .
 .  unsigned int (*_bfd_coff_swap_scnhdr_out)
-.    (bfd *, void *, void *);
+.    (bfd *, void *, void *, const asection *);
 .
 .  unsigned int _bfd_filhsz;
 .  unsigned int _bfd_aoutsz;
@@ -1560,8 +1560,8 @@ INTERNAL
 .#define bfd_coff_swap_sym_out(abfd, i,o) \
 .  ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
 .
-.#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
-.  ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
+.#define bfd_coff_swap_scnhdr_out(abfd, i, o, sec) \
+.  ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o, sec))
 .
 .#define bfd_coff_swap_filehdr_out(abfd, i,o) \
 .  ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
@@ -3811,7 +3811,7 @@ coff_write_object_contents (bfd * abfd)
          SCNHDR buff;
          bfd_size_type amt = bfd_coff_scnhsz (abfd);
 
-         if (bfd_coff_swap_scnhdr_out (abfd, &section, &buff) == 0
+         if (bfd_coff_swap_scnhdr_out (abfd, &section, &buff, current) == 0
              || bfd_write (& buff, amt, abfd) != amt)
            return false;
        }
@@ -3937,7 +3937,7 @@ coff_write_object_contents (bfd * abfd)
          scnhdr.s_nlnno = current->target_index;
          scnhdr.s_flags = STYP_OVRFLO;
          amt = bfd_coff_scnhsz (abfd);
-         if (bfd_coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0
+         if (bfd_coff_swap_scnhdr_out (abfd, &scnhdr, &buff, current) == 0
              || bfd_write (& buff, amt, abfd) != amt)
            return false;
        }
index 823d3fd9e6599624ba4ef8ee820de98d872cef26..e94c80fdc02bb01bb962fb7b09a2b6f8730329b0 100644 (file)
@@ -775,7 +775,8 @@ coff_swap_scnhdr_in (bfd * abfd, void * ext, void * in)
 
 ATTRIBUTE_UNUSED
 static unsigned int
-coff_swap_scnhdr_out (bfd * abfd, void * in, void * out)
+coff_swap_scnhdr_out (bfd * abfd, void * in, void * out,
+                     const asection *section ATTRIBUTE_UNUSED)
 {
   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
   SCNHDR *scnhdr_ext = (SCNHDR *) out;
index a77107b38a73594660b2fff6d0ef95076da86cdf..4f305ebad8b7a59b23557c5e5246e4997deebdb9 100644 (file)
@@ -2517,7 +2517,7 @@ _bfd_ecoff_write_object_contents (bfd *abfd)
       section.s_flags = ecoff_sec_to_styp_flags (current->name,
                                                 current->flags);
 
-      if (bfd_coff_swap_scnhdr_out (abfd, (void *) &section, buff) == 0
+      if (bfd_coff_swap_scnhdr_out (abfd, (void *) &section, buff, current) == 0
          || bfd_write (buff, scnhsz, abfd) != scnhsz)
        goto error_return;
 
index 05ebe3583633fb5bd3041cd984b6baa59a11f2df..946fd4c534b71793587a7e4cfc483d3f06178be0 100644 (file)
@@ -773,7 +773,7 @@ typedef struct
     (bfd *, void *, void *);
 
   unsigned int (*_bfd_coff_swap_scnhdr_out)
-    (bfd *, void *, void *);
+    (bfd *, void *, void *, const asection *);
 
   unsigned int _bfd_filhsz;
   unsigned int _bfd_aoutsz;
@@ -899,8 +899,8 @@ typedef struct
 #define bfd_coff_swap_sym_out(abfd, i,o) \
   ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
 
-#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
-  ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
+#define bfd_coff_swap_scnhdr_out(abfd, i, o, sec) \
+  ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o, sec))
 
 #define bfd_coff_swap_filehdr_out(abfd, i,o) \
   ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
index fc1ada251b6b0ba2a9585b7ead4efac3f99e9485..b2d8da81e5cff2f7119ae1a7a185939181187a0f 100644 (file)
@@ -453,7 +453,7 @@ void _bfd_XXi_swap_lineno_in (bfd *, void *, void *);
 unsigned _bfd_XXi_swap_lineno_out (bfd *, void *, void *);
 void _bfd_XXi_swap_aouthdr_in (bfd *, void *, void *);
 unsigned _bfd_XXi_swap_aouthdr_out (bfd *, void *, void *);
-unsigned _bfd_XXi_swap_scnhdr_out (bfd *, void *, void *);
+unsigned _bfd_XXi_swap_scnhdr_out (bfd *, void *, void *, const asection *);
 bool _bfd_XX_print_private_bfd_data_common (bfd *, void *);
 bool _bfd_XX_bfd_copy_private_bfd_data_common (bfd *, bfd *);
 void _bfd_XX_get_symbol_info (bfd *, asymbol *, symbol_info *);
index 1a195d97c5c07809daf57a164797675092b51741..938a29d7e3ade036239dd4e1191a5e634037eb2f 100644 (file)
@@ -919,7 +919,8 @@ _bfd_XX_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
 }
 
 unsigned int
-_bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out)
+_bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out,
+                         const asection *section ATTRIBUTE_UNUSED)
 {
   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
   SCNHDR *scnhdr_ext = (SCNHDR *) out;