[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