[PATCH] bfd/{pe,pei}-x86_64: Decrease preferred section alignment from 16 to 4

LIU Hao lh_mouse@126.com
Fri Mar 28 06:34:15 GMT 2025


-- 
Best regards,
LIU Hao

-------------- next part --------------
From 116a1b7372103f8b415d04551b1e4310510472e9 Mon Sep 17 00:00:00 2001
From: LIU Hao <lh_mouse@126.com>
Date: Fri, 28 Mar 2025 11:17:41 +0800
Subject: [PATCH] bfd/{pe,pei}-x86_64: Decrease preferred section alignment
 from 16 to 4

On x86-64, sections require only 4-byte alignment. For example, we compile this
program with Clang for x86_64-w64-mingw32:

   ```
   $ cat pe.c
   int fn(int x) { return x; }
   extern const int ro = 42;
   int rw = 43;

   $ clang -target x86_64-w64-mingw32 -Wno-extern-initializer -Os pe.c -c -o pe.Os.o

   $ clang -target x86_64-w64-mingw32 -Wno-extern-initializer -O2 pe.c -c -o pe.O2.o

   $ objdump -hw pe.Os.o pe.O2.o

   pe.Os.o:     file format pe-x86-64

   Sections:
   Idx Name          Size      VMA               LMA               File off  Algn  Flags
     0 .text         00000003  0000000000000000  0000000000000000  000000dc  2**2  CONTENTS, ALLOC, LOAD, READONLY, CODE
     1 .data         00000004  0000000000000000  0000000000000000  000000df  2**2  CONTENTS, ALLOC, LOAD, DATA
     2 .bss          00000000  0000000000000000  0000000000000000  00000000  2**2  ALLOC
     3 .rdata        00000004  0000000000000000  0000000000000000  000000e3  2**2  CONTENTS, ALLOC, LOAD, READONLY, DATA
     4 .llvm_addrsig 00000000  0000000000000000  0000000000000000  000000e7  2**0  CONTENTS, READONLY, EXCLUDE, NOREAD

   pe.O2.o:     file format pe-x86-64

   Sections:
   Idx Name          Size      VMA               LMA               File off  Algn  Flags
     0 .text         00000003  0000000000000000  0000000000000000  000000dc  2**4  CONTENTS, ALLOC, LOAD, READONLY, CODE
     1 .data         00000004  0000000000000000  0000000000000000  000000df  2**2  CONTENTS, ALLOC, LOAD, DATA
     2 .bss          00000000  0000000000000000  0000000000000000  00000000  2**2  ALLOC
     3 .rdata        00000004  0000000000000000  0000000000000000  000000e3  2**2  CONTENTS, ALLOC, LOAD, READONLY, DATA
     4 .llvm_addrsig 00000000  0000000000000000  0000000000000000  000000e7  2**0  CONTENTS, READONLY, EXCLUDE, NOREAD
   ```

The alignment of `.text` is 4 when optimizing for size, and 16 when optimizing
for speed. The exact same behavior can be observed when compiling with MSVC, or
when targeting ARM64. Reducing alignment of `.text` can shrink padding gaps
between functions from different subsections or object files.

Signed-off-by: LIU Hao <lh_mouse@126.com>
---
 bfd/pe-x86_64.c  | 8 ++++----
 bfd/pei-x86_64.c | 8 ++++----
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/bfd/pe-x86_64.c b/bfd/pe-x86_64.c
index d56d75dabd0..1fa1f02aed7 100644
--- a/bfd/pe-x86_64.c
+++ b/bfd/pe-x86_64.c
@@ -48,13 +48,13 @@
 
 #define COFF_SECTION_ALIGNMENT_ENTRIES \
 { COFF_SECTION_NAME_EXACT_MATCH (".bss"), \
-  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
+  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 { COFF_SECTION_NAME_PARTIAL_MATCH (".data"), \
-  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
+  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 { COFF_SECTION_NAME_PARTIAL_MATCH (".rdata"), \
-  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
+  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 { COFF_SECTION_NAME_PARTIAL_MATCH (".text"), \
-  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
+  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 { COFF_SECTION_NAME_PARTIAL_MATCH (".idata"), \
   COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 { COFF_SECTION_NAME_EXACT_MATCH (".pdata"), \
diff --git a/bfd/pei-x86_64.c b/bfd/pei-x86_64.c
index 3f8f255af33..23ead5b5ac3 100644
--- a/bfd/pei-x86_64.c
+++ b/bfd/pei-x86_64.c
@@ -42,13 +42,13 @@
 
 #define COFF_SECTION_ALIGNMENT_ENTRIES \
 { COFF_SECTION_NAME_EXACT_MATCH (".bss"), \
-  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
+  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 { COFF_SECTION_NAME_PARTIAL_MATCH (".data"), \
-  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
+  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 { COFF_SECTION_NAME_PARTIAL_MATCH (".rdata"), \
-  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
+  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 { COFF_SECTION_NAME_PARTIAL_MATCH (".text"), \
-  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
+  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 { COFF_SECTION_NAME_PARTIAL_MATCH (".idata"), \
   COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 { COFF_SECTION_NAME_EXACT_MATCH (".pdata"), \
-- 
2.49.0

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 840 bytes
Desc: OpenPGP digital signature
URL: <https://sourceware.org/pipermail/binutils/attachments/20250328/c74205b5/attachment-0001.sig>


More information about the Binutils mailing list