[PATCH 04/17] bfd/COFF: optionally pass BFD section into swap_scnhdr_out() hook

Jan Beulich jbeulich@suse.com
Mon Aug 4 09:16:29 GMT 2025


_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.

--- a/bfd/coff-go32.c
+++ b/bfd/coff-go32.c
@@ -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, vo
 }
 
 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;
--- a/bfd/coff-rs6000.c
+++ b/bfd/coff-rs6000.c
@@ -4352,7 +4352,7 @@ xcoff_generate_rtinit  (bfd *abfd, const
   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
--- a/bfd/coff-stgo32.c
+++ b/bfd/coff-stgo32.c
@@ -61,7 +61,7 @@ static bool go32exe_copy_private_bfd_dat
 /* 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
--- a/bfd/coff64-rs6000.c
+++ b/bfd/coff64-rs6000.c
@@ -2377,9 +2377,9 @@ xcoff64_generate_rtinit (bfd *abfd, cons
   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
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -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;
 	}
--- a/bfd/coffswap.h
+++ b/bfd/coffswap.h
@@ -781,7 +781,8 @@ coff_swap_scnhdr_in (bfd * abfd, void *
 
 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;
--- a/bfd/ecoff.c
+++ b/bfd/ecoff.c
@@ -2517,7 +2517,7 @@ _bfd_ecoff_write_object_contents (bfd *a
       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;
 
--- a/bfd/libcoff.h
+++ b/bfd/libcoff.h
@@ -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))
--- a/bfd/libpei.h
+++ b/bfd/libpei.h
@@ -453,7 +453,7 @@ void _bfd_XXi_swap_lineno_in (bfd *, voi
 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 *);
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -913,7 +913,8 @@ _bfd_XX_only_swap_filehdr_out (bfd * abf
 }
 
 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;



More information about the Binutils mailing list