PR27567, Linking PE files adds alignment section flags to executables

Message ID 20210416134741.GV5425@bubble.grove.modra.org
State New
Headers show
Series
  • PR27567, Linking PE files adds alignment section flags to executables
Related show

Commit Message

Luis Machado via Binutils April 16, 2021, 1:47 p.m.
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.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

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/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