[binutils-gdb] bfd/COFF: optionally pass BFD section into swap_scnhdr_out() hook
Jan Beulich
jbeulich@sourceware.org
Fri Oct 10 14:05:08 GMT 2025
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=5f51d87cc0653b2fe6a7b87eb07222514ba876ce
commit 5f51d87cc0653b2fe6a7b87eb07222514ba876ce
Author: Jan Beulich <jbeulich@suse.com>
Date: Fri Oct 10 15:58:55 2025 +0200
bfd/COFF: optionally pass BFD section into swap_scnhdr_out() hook
_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.
Diff:
---
bfd/coff-go32.c | 5 +++--
bfd/coff-rs6000.c | 2 +-
bfd/coff-stgo32.c | 2 +-
bfd/coff64-rs6000.c | 6 +++---
bfd/coffcode.h | 10 +++++-----
bfd/coffswap.h | 3 ++-
bfd/ecoff.c | 2 +-
bfd/libcoff.h | 6 +++---
bfd/libpei.h | 2 +-
bfd/peXXigen.c | 3 ++-
10 files changed, 22 insertions(+), 19 deletions(-)
diff --git a/bfd/coff-go32.c b/bfd/coff-go32.c
index 9922e73a9e6..f50e0b920ee 100644
--- 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, 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;
diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c
index 3c18518b0c8..803b51c9fc3 100644
--- a/bfd/coff-rs6000.c
+++ b/bfd/coff-rs6000.c
@@ -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
diff --git a/bfd/coff-stgo32.c b/bfd/coff-stgo32.c
index e2ff900f668..f6ed2427c1c 100644
--- a/bfd/coff-stgo32.c
+++ b/bfd/coff-stgo32.c
@@ -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
diff --git a/bfd/coff64-rs6000.c b/bfd/coff64-rs6000.c
index d335348c196..814d25eda90 100644
--- a/bfd/coff64-rs6000.c
+++ b/bfd/coff64-rs6000.c
@@ -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
diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index a466af19736..7de6a93f904 100644
--- 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, §ion, &buff) == 0
+ if (bfd_coff_swap_scnhdr_out (abfd, §ion, &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;
}
diff --git a/bfd/coffswap.h b/bfd/coffswap.h
index 823d3fd9e65..e94c80fdc02 100644
--- a/bfd/coffswap.h
+++ b/bfd/coffswap.h
@@ -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;
diff --git a/bfd/ecoff.c b/bfd/ecoff.c
index a77107b38a7..4f305ebad8b 100644
--- a/bfd/ecoff.c
+++ b/bfd/ecoff.c
@@ -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 *) §ion, buff) == 0
+ if (bfd_coff_swap_scnhdr_out (abfd, (void *) §ion, buff, current) == 0
|| bfd_write (buff, scnhsz, abfd) != scnhsz)
goto error_return;
diff --git a/bfd/libcoff.h b/bfd/libcoff.h
index 05ebe358363..946fd4c534b 100644
--- 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))
diff --git a/bfd/libpei.h b/bfd/libpei.h
index fc1ada251b6..b2d8da81e5c 100644
--- a/bfd/libpei.h
+++ b/bfd/libpei.h
@@ -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 *);
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
index 1a195d97c5c..938a29d7e3a 100644
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -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;
More information about the Binutils-cvs
mailing list