From: Jan Beulich Date: Fri, 10 Oct 2025 13:58:55 +0000 (+0200) Subject: bfd/COFF: optionally pass BFD section into swap_scnhdr_out() hook X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5f51d87cc0653b2fe6a7b87eb07222514ba876ce;p=thirdparty%2Fbinutils-gdb.git 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 --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;