From 6f8f6017a0c4e22c6417c597c31b0a937d148a39 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 16 Apr 2021 22:29:05 +0930 Subject: [PATCH] PR27567, Linking PE files adds alignment section flags to executables So don't set those flags for an executable. In the patch I also test DYNAMIC even though the PE bfd code doesn't appear to set it for dlls. I figure it doesn't hurt to include that flag too. PR 27567 bfd/ * coffcode.h (styp_to_sec_flags): Use an unsigned long styp_flags. (coff_write_object_contents): Pass bfd to COFF_ENCODE_ALIGNMENT, ignore alignment checks when return is false. Formatting. include/ * coff/internal.h (struct internal_scnhdr): Make s_flags unsigned long. * coff/pe.h (COFF_ENCODE_ALIGNMENT): Don't set align flags for an executable and return false. Do so for a relocatable object and evaluate to true. * coff/ti.h (COFF_ENCODE_ALIGNMENT): Add bfd arg and evaluate to true. (COFF_DECODE_ALIGNMENT): Formatting. * coff/z80.h (COFF_ENCODE_ALIGNMENT): Similarly. (COFF_DECODE_ALIGNMENT): Similarly. --- bfd/ChangeLog | 7 +++++++ bfd/coffcode.h | 16 ++++++++-------- include/ChangeLog | 12 ++++++++++++ include/coff/internal.h | 2 +- include/coff/pe.h | 9 ++++++--- include/coff/ti.h | 5 +++-- include/coff/z80.h | 5 +++-- 7 files changed, 40 insertions(+), 16 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 702d4026ee8..513d6e9d3f3 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2021-04-16 Alan Modra + + PR 27567 + * coffcode.h (styp_to_sec_flags): Use an unsigned long styp_flags. + (coff_write_object_contents): Pass bfd to COFF_ENCODE_ALIGNMENT, + ignore alignment checks when return is false. Formatting. + 2021-04-15 Nelson Chu PR27584 diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 8006baa2595..f65f3352e46 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -737,7 +737,7 @@ styp_to_sec_flags (bfd *abfd, flagword *flags_ptr) { struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr; - long styp_flags = internal_s->s_flags; + unsigned long styp_flags = internal_s->s_flags; flagword sec_flags = 0; #ifdef STYP_BLOCK @@ -3643,18 +3643,18 @@ coff_write_object_contents (bfd * abfd) #ifdef COFF_ENCODE_ALIGNMENT - COFF_ENCODE_ALIGNMENT(section, current->alignment_power); - if ((unsigned int)COFF_DECODE_ALIGNMENT(section.s_flags) - != current->alignment_power) + if (COFF_ENCODE_ALIGNMENT (abfd, section, current->alignment_power) + && (COFF_DECODE_ALIGNMENT (section.s_flags) + != current->alignment_power)) { - bool warn = coff_data (abfd)->link_info - && !bfd_link_relocatable (coff_data (abfd)->link_info); + bool warn = (coff_data (abfd)->link_info + && !bfd_link_relocatable (coff_data (abfd)->link_info)); _bfd_error_handler /* xgettext:c-format */ (_("%pB:%s section %s: alignment 2**%u not representable"), - abfd, warn ? " warning:" : "", current->name, - current->alignment_power); + abfd, warn ? " warning:" : "", current->name, + current->alignment_power); if (!warn) { bfd_set_error (bfd_error_nonrepresentable_section); diff --git a/include/ChangeLog b/include/ChangeLog index 752b8fec35f..83ae2cb84cc 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,15 @@ +2021-04-16 Alan Modra + + PR 27567 + * coff/internal.h (struct internal_scnhdr): Make s_flags unsigned long. + * coff/pe.h (COFF_ENCODE_ALIGNMENT): Don't set align flags for an + executable and return false. Do so for a relocatable object and + evaluate to true. + * coff/ti.h (COFF_ENCODE_ALIGNMENT): Add bfd arg and evaluate to true. + (COFF_DECODE_ALIGNMENT): Formatting. + * coff/z80.h (COFF_ENCODE_ALIGNMENT): Similarly. + (COFF_DECODE_ALIGNMENT): Similarly. + 2021-04-09 Alan Modra * dis-asm.h (struct disassemble_info): Add dynrelbuf and dynrelcount. diff --git a/include/coff/internal.h b/include/coff/internal.h index 90c901d2987..b09bb0f469d 100644 --- a/include/coff/internal.h +++ b/include/coff/internal.h @@ -407,7 +407,7 @@ struct internal_scnhdr bfd_vma s_lnnoptr; /* file ptr to line numbers */ unsigned long s_nreloc; /* number of relocation entries */ unsigned long s_nlnno; /* number of line number entries*/ - long s_flags; /* flags */ + unsigned long s_flags; /* flags */ unsigned char s_page; /* TI COFF load page */ }; diff --git a/include/coff/pe.h b/include/coff/pe.h index a157812ef7f..d6e84691677 100644 --- a/include/coff/pe.h +++ b/include/coff/pe.h @@ -105,9 +105,12 @@ #define IMAGE_SCN_ALIGN_8192BYTES IMAGE_SCN_ALIGN_POWER_CONST (13) /* Encode alignment power into IMAGE_SCN_ALIGN bits of s_flags. */ -#define COFF_ENCODE_ALIGNMENT(SECTION, ALIGNMENT_POWER) \ - ((SECTION).s_flags |= IMAGE_SCN_ALIGN_POWER_CONST ((ALIGNMENT_POWER) <= 13 \ - ? (ALIGNMENT_POWER) : 13)) +#define COFF_ENCODE_ALIGNMENT(ABFD, SECTION, ALIGNMENT_POWER) \ + (((ABFD)->flags & (EXEC_P | DYNAMIC)) != 0 ? false \ + : ((SECTION).s_flags \ + |= IMAGE_SCN_ALIGN_POWER_CONST ((ALIGNMENT_POWER) < 13 \ + ? (ALIGNMENT_POWER) : 13), \ + true)) #define COFF_DECODE_ALIGNMENT(X) \ IMAGE_SCN_ALIGN_POWER_NUM ((X) & IMAGE_SCN_ALIGN_POWER_BIT_MASK) diff --git a/include/coff/ti.h b/include/coff/ti.h index 5d242d12c24..e51cf96bff9 100644 --- a/include/coff/ti.h +++ b/include/coff/ti.h @@ -88,9 +88,10 @@ struct external_filehdr #define COFF_ALIGN_IN_SECTION_HEADER 1 #define COFF_ALIGN_IN_S_FLAGS 1 /* requires a power-of-two argument */ -#define COFF_ENCODE_ALIGNMENT(S,X) ((S).s_flags |= (((unsigned)(X)&0xF)<<8)) +#define COFF_ENCODE_ALIGNMENT(B,S,X) \ + ((S).s_flags |= (((unsigned) (X) & 0xF) << 8), true) /* result is a power of two */ -#define COFF_DECODE_ALIGNMENT(X) (((X)>>8)&0xF) +#define COFF_DECODE_ALIGNMENT(X) (((X) >> 8) & 0xF) #define COFF0_P(ABFD) (bfd_coff_filhsz(ABFD) == FILHSZ_V0) #define COFF2_P(ABFD) (bfd_coff_scnhsz(ABFD) != SCNHSZ_V01) diff --git a/include/coff/z80.h b/include/coff/z80.h index 1ba8e45fea2..1fd94fe5145 100644 --- a/include/coff/z80.h +++ b/include/coff/z80.h @@ -35,9 +35,10 @@ #define COFF_ALIGN_IN_S_FLAGS 1 #define F_ALGNMASK 0x0F00 /* requires a power-of-two argument */ -#define COFF_ENCODE_ALIGNMENT(S,X) ((S).s_flags |= (((unsigned)(X)&0xF)<<8)) +#define COFF_ENCODE_ALIGNMENT(B,S,X) \ + ((S).s_flags |= (((unsigned) (X) & 0xF) << 8), true) /* result is a power of two */ -#define COFF_DECODE_ALIGNMENT(X) (((X)>>8)&0xF) +#define COFF_DECODE_ALIGNMENT(X) (((X) >> 8) & 0xF) #define Z80MAGIC 0x805A -- 2.30.2