From: Jan Beulich Date: Fri, 10 Oct 2025 14:01:16 +0000 (+0200) Subject: bfd / PE/COFF: permit SEC_READONLY and consolidate X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b7bbb694201d7450258080d4fa9b759c27be50e;p=thirdparty%2Fbinutils-gdb.git bfd / PE/COFF: permit SEC_READONLY and consolidate Without SEC_READONLY, even the default .text section would end up with the IMAGE_SCN_MEM_WRITE flag, which is clearly wrong. (Afaict the flag, oddly enough, doesn't affect the final linked binary, so there likely are more anomalies.) However, as suggested by Richard Earnshaw, PE's requirements are really target independent. Consolidate SEC_CODE, SEC_DATA, SEC_READONLY, SEC_LINK_ONCE, and SEC_LINK_DUPLICATES into target-independent code. Yet of course targets not using CREATE_*_COFF_TARGET_VEC() won't benefit. Note that in coff-arm.c the EXTRA_S_FLAGS conditional was also stale (leftover from EPOC removal), and hence can go away. --- diff --git a/bfd/coff-arm.c b/bfd/coff-arm.c index ee574518b77..94faaf640bb 100644 --- a/bfd/coff-arm.c +++ b/bfd/coff-arm.c @@ -2560,17 +2560,9 @@ coff_arm_final_link_postscript (bfd * abfd ATTRIBUTE_UNUSED, #define TARGET_UNDERSCORE 0 #endif -#ifndef EXTRA_S_FLAGS -#ifdef COFF_WITH_PE -#define EXTRA_S_FLAGS (SEC_CODE | SEC_LINK_ONCE | SEC_LINK_DUPLICATES) -#else -#define EXTRA_S_FLAGS SEC_CODE -#endif -#endif - /* Forward declaration for use initialising alternative_target field. */ extern const bfd_target TARGET_BIG_SYM ; /* Target vectors. */ -CREATE_LITTLE_COFF_TARGET_VEC (TARGET_LITTLE_SYM, TARGET_LITTLE_NAME, D_PAGED, EXTRA_S_FLAGS, TARGET_UNDERSCORE, & TARGET_BIG_SYM, COFF_SWAP_TABLE) -CREATE_BIG_COFF_TARGET_VEC (TARGET_BIG_SYM, TARGET_BIG_NAME, D_PAGED, EXTRA_S_FLAGS, TARGET_UNDERSCORE, & TARGET_LITTLE_SYM, COFF_SWAP_TABLE) +CREATE_LITTLE_COFF_TARGET_VEC (TARGET_LITTLE_SYM, TARGET_LITTLE_NAME, D_PAGED, SEC_CODE, TARGET_UNDERSCORE, & TARGET_BIG_SYM, COFF_SWAP_TABLE) +CREATE_BIG_COFF_TARGET_VEC (TARGET_BIG_SYM, TARGET_BIG_NAME, D_PAGED, SEC_CODE, TARGET_UNDERSCORE, & TARGET_LITTLE_SYM, COFF_SWAP_TABLE) diff --git a/bfd/coff-mcore.c b/bfd/coff-mcore.c index fab10a7ae08..28adbd9329f 100644 --- a/bfd/coff-mcore.c +++ b/bfd/coff-mcore.c @@ -564,8 +564,8 @@ extern const bfd_target TARGET_LITTLE_SYM; /* The transfer vectors that lead the outside world to all of the above. */ CREATE_BIG_COFF_TARGET_VEC (TARGET_BIG_SYM, TARGET_BIG_NAME, D_PAGED, - (SEC_CODE | SEC_DATA | SEC_DEBUGGING | SEC_READONLY | SEC_LINK_ONCE | SEC_LINK_DUPLICATES), + SEC_DEBUGGING, 0, & TARGET_LITTLE_SYM, COFF_SWAP_TABLE) CREATE_LITTLE_COFF_TARGET_VEC (TARGET_LITTLE_SYM, TARGET_LITTLE_NAME, D_PAGED, - (SEC_CODE | SEC_DATA | SEC_DEBUGGING | SEC_READONLY | SEC_LINK_ONCE | SEC_LINK_DUPLICATES), + SEC_DEBUGGING, 0, & TARGET_BIG_SYM, COFF_SWAP_TABLE) diff --git a/bfd/coff-sh.c b/bfd/coff-sh.c index c3e0e420230..008d1e7b38f 100644 --- a/bfd/coff-sh.c +++ b/bfd/coff-sh.c @@ -3023,7 +3023,7 @@ CREATE_BIG_COFF_TARGET_VEC (sh_coff_vec, "coff-sh", BFD_IS_RELAXABLE, 0, '_', NU #ifdef COFF_WITH_PE CREATE_LITTLE_COFF_TARGET_VEC (TARGET_SYM, TARGET_SHL_NAME, BFD_IS_RELAXABLE, - SEC_CODE | SEC_DATA, '_', NULL, COFF_SWAP_TABLE); + 0, '_', NULL, COFF_SWAP_TABLE); #else CREATE_LITTLE_COFF_TARGET_VEC (TARGET_SYM, TARGET_SHL_NAME, BFD_IS_RELAXABLE, 0, '_', NULL, COFF_SWAP_TABLE) diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 7de6a93f904..5cfdb2dc56b 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -6057,6 +6057,13 @@ static const bfd_coff_backend_data bigobj_swap_table = #define coff_bfd_define_start_stop bfd_generic_define_start_stop #endif +#ifdef COFF_WITH_PE +#define PE_EXTRA_S_FLAGS (SEC_CODE | SEC_DATA | SEC_READONLY | SEC_LINK_ONCE \ + | SEC_LINK_DUPLICATES) +#else +#define PE_EXTRA_S_FLAGS 0 +#endif + #define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE) \ const bfd_target VAR = \ { \ @@ -6068,7 +6075,8 @@ const bfd_target VAR = \ (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | \ HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS), \ /* section flags */ \ - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\ + (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS \ + | PE_EXTRA_S_FLAGS), \ UNDER, /* Leading symbol underscore. */ \ '/', /* AR_pad_char. */ \ 15, /* AR_max_namelen. */ \ @@ -6130,7 +6138,8 @@ const bfd_target VAR = \ (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | \ HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS), \ /* section flags */ \ - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\ + (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS \ + | PE_EXTRA_S_FLAGS), \ UNDER, /* Leading symbol underscore. */ \ '/', /* AR_pad_char. */ \ 15, /* AR_max_namelen. */ \ @@ -6192,7 +6201,8 @@ const bfd_target VAR = \ (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | \ HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS), \ /* section flags */ \ - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\ + (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS \ + | PE_EXTRA_S_FLAGS), \ UNDER, /* Leading symbol underscore. */ \ '/', /* AR_pad_char. */ \ 15, /* AR_max_namelen. */ \