[binutils-gdb] bfd/ELF: restrict file alignment for object files

Jan Beulich jbeulich@sourceware.org
Fri Oct 11 06:21:52 GMT 2024


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=1f1b5e506bf0d9bffef8525eb9bee19646713eb6

commit 1f1b5e506bf0d9bffef8525eb9bee19646713eb6
Author: Jan Beulich <jbeulich@suse.com>
Date:   Fri Oct 11 08:19:34 2024 +0200

    bfd/ELF: restrict file alignment for object files
    
    While for executables properly aligning sections within the file can be
    quite relevant, the same is of pretty little importance for relocatable
    object files. Avoid passing "true" into
    _bfd_elf_assign_file_position_for_section() when dealing with object
    files, but compensate minimally by applying log_file_align in such
    cases as a cap to the alignment put in place.

Diff:
---
 bfd/elf-bfd.h                                      |  2 +-
 bfd/elf.c                                          | 44 +++++++++++++++-------
 bfd/elflink.c                                      |  6 +--
 .../testsuite/binutils-all/i386/compressed-1b.d    |  8 ++--
 .../testsuite/binutils-all/i386/compressed-1c.d    |  8 ++--
 binutils/testsuite/binutils-all/readelf.s          |  2 +-
 gas/testsuite/gas/aarch64/tail_padding.d           |  6 +--
 gas/testsuite/gas/arm/ehabi-pacbti-m.d             |  2 +-
 gas/testsuite/gas/ia64/group-1.d                   | 10 ++---
 gas/testsuite/gas/ia64/group-2.d                   | 14 +++----
 gas/testsuite/gas/mmix/bspec-2.d                   |  4 +-
 ld/testsuite/ld-x86-64/pr27590.rd                  | 18 ++++-----
 12 files changed, 70 insertions(+), 54 deletions(-)

diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index b89d3dda05d..96cf11936ae 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -2540,7 +2540,7 @@ extern long _bfd_elf_link_lookup_local_dynindx
 extern bool _bfd_elf_compute_section_file_positions
   (bfd *, struct bfd_link_info *);
 extern file_ptr _bfd_elf_assign_file_position_for_section
-  (Elf_Internal_Shdr *, file_ptr, bool);
+  (Elf_Internal_Shdr *, file_ptr, bool, unsigned char);
 extern bool _bfd_elf_modify_headers
   (bfd *, struct bfd_link_info *);
 
diff --git a/bfd/elf.c b/bfd/elf.c
index 997befd5686..27d45fc17a5 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4572,10 +4572,23 @@ align_file_position (file_ptr off, int align)
 file_ptr
 _bfd_elf_assign_file_position_for_section (Elf_Internal_Shdr *i_shdrp,
 					   file_ptr offset,
-					   bool align)
+					   bool align,
+					   unsigned char log_file_align)
 {
-  if (align && i_shdrp->sh_addralign > 1)
-    offset = BFD_ALIGN (offset, i_shdrp->sh_addralign & -i_shdrp->sh_addralign);
+  if (i_shdrp->sh_addralign > 1)
+    {
+      file_ptr salign = i_shdrp->sh_addralign & -i_shdrp->sh_addralign;
+
+      if (align)
+	offset = BFD_ALIGN (offset, salign);
+      else if (log_file_align)
+	{
+	  /* Heuristic: Cap alignment at log_file_align.  */
+	  file_ptr falign = 1u << log_file_align;
+
+	  offset = BFD_ALIGN (offset, salign < falign ? salign : falign);
+	}
+    }
   i_shdrp->sh_offset = offset;
   if (i_shdrp->bfd_section != NULL)
     i_shdrp->bfd_section->filepos = offset;
@@ -4663,18 +4676,18 @@ _bfd_elf_compute_section_file_positions (bfd *abfd,
       off = elf_next_file_pos (abfd);
 
       hdr = & elf_symtab_hdr (abfd);
-      off = _bfd_elf_assign_file_position_for_section (hdr, off, true);
+      off = _bfd_elf_assign_file_position_for_section (hdr, off, true, 0);
 
       if (elf_symtab_shndx_list (abfd) != NULL)
 	{
 	  hdr = & elf_symtab_shndx_list (abfd)->hdr;
 	  if (hdr->sh_size != 0)
-	    off = _bfd_elf_assign_file_position_for_section (hdr, off, true);
+	    off = _bfd_elf_assign_file_position_for_section (hdr, off, true, 0);
 	  /* FIXME: What about other symtab_shndx sections in the list ?  */
 	}
 
       hdr = &elf_tdata (abfd)->strtab_hdr;
-      off = _bfd_elf_assign_file_position_for_section (hdr, off, true);
+      off = _bfd_elf_assign_file_position_for_section (hdr, off, true, 0);
 
       elf_next_file_pos (abfd) = off;
 
@@ -6548,8 +6561,8 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
 	  else
 	    align = hdr->sh_addralign & -hdr->sh_addralign;
 	  off += vma_page_aligned_bias (hdr->sh_addr, off, align);
-	  off = _bfd_elf_assign_file_position_for_section (hdr, off,
-							   false);
+	  off = _bfd_elf_assign_file_position_for_section (hdr, off, false,
+							   bed->s->log_file_align);
 	}
       else if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
 		&& hdr->bfd_section == NULL)
@@ -6566,7 +6579,7 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
 	       || hdr == i_shdrpp[elf_shstrtab_sec (abfd)])
 	hdr->sh_offset = -1;
       else
-	off = _bfd_elf_assign_file_position_for_section (hdr, off, true);
+	off = _bfd_elf_assign_file_position_for_section (hdr, off, true, 0);
     }
   elf_next_file_pos (abfd) = off;
 
@@ -6803,7 +6816,8 @@ assign_file_positions_except_relocs (bfd *abfd,
 	      hdr->sh_offset = -1;
 	    }
 	  else
-	    off = _bfd_elf_assign_file_position_for_section (hdr, off, true);
+	    off = _bfd_elf_assign_file_position_for_section (hdr, off, false,
+							     0);
 	}
 
       elf_next_file_pos (abfd) = off;
@@ -7018,7 +7032,7 @@ _bfd_elf_assign_file_positions_for_non_load (bfd *abfd)
   Elf_Internal_Shdr **shdrpp, **end_shdrpp;
   Elf_Internal_Shdr *shdrp;
   Elf_Internal_Ehdr *i_ehdrp;
-  const struct elf_backend_data *bed;
+  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
 
   /* Skip non-load sections without section header.  */
   if ((abfd->flags & BFD_NO_SECTION_HEADER) != 0)
@@ -7086,7 +7100,10 @@ _bfd_elf_assign_file_positions_for_non_load (bfd *abfd)
 	      sec->contents = NULL;
 	    }
 
-	  off = _bfd_elf_assign_file_position_for_section (shdrp, off, true);
+	  off = _bfd_elf_assign_file_position_for_section (shdrp, off,
+		  (abfd->flags & (EXEC_P | DYNAMIC))
+		  || bfd_get_format (abfd) == bfd_core,
+		  bed->s->log_file_align);
 	}
     }
 
@@ -7095,11 +7112,10 @@ _bfd_elf_assign_file_positions_for_non_load (bfd *abfd)
   _bfd_elf_strtab_finalize (elf_shstrtab (abfd));
   shdrp = &elf_tdata (abfd)->shstrtab_hdr;
   shdrp->sh_size = _bfd_elf_strtab_size (elf_shstrtab (abfd));
-  off = _bfd_elf_assign_file_position_for_section (shdrp, off, true);
+  off = _bfd_elf_assign_file_position_for_section (shdrp, off, true, 0);
 
   /* Place the section headers.  */
   i_ehdrp = elf_elfheader (abfd);
-  bed = get_elf_backend_data (abfd);
   off = align_file_position (off, 1 << bed->s->log_file_align);
   i_ehdrp->e_shoff = off;
   off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
diff --git a/bfd/elflink.c b/bfd/elflink.c
index a498dbb12a6..19a9aec3f9d 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -12926,7 +12926,7 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
     {
       file_ptr off = elf_next_file_pos (abfd);
 
-      _bfd_elf_assign_file_position_for_section (symtab_hdr, off, true);
+      _bfd_elf_assign_file_position_for_section (symtab_hdr, off, true, 0);
 
       /* Note that at this point elf_next_file_pos (abfd) is
 	 incorrect.  We do not yet know the size of the .symtab section.
@@ -13370,7 +13370,7 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
 	      symtab_shndx_hdr->sh_size = amt;
 
 	      off = _bfd_elf_assign_file_position_for_section (symtab_shndx_hdr,
-							       off, true);
+							       off, true, 0);
 
 	      if (bfd_seek (abfd, symtab_shndx_hdr->sh_offset, SEEK_SET) != 0
 		  || (bfd_write (flinfo.symshndxbuf, amt, abfd) != amt))
@@ -13394,7 +13394,7 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
       symstrtab_hdr->sh_addralign = 1;
 
       off = _bfd_elf_assign_file_position_for_section (symstrtab_hdr,
-						       off, true);
+						       off, true, 0);
       elf_next_file_pos (abfd) = off;
 
       if (bfd_seek (abfd, symstrtab_hdr->sh_offset, SEEK_SET) != 0
diff --git a/binutils/testsuite/binutils-all/i386/compressed-1b.d b/binutils/testsuite/binutils-all/i386/compressed-1b.d
index 6e45e552fc8..8b3f75ab846 100644
--- a/binutils/testsuite/binutils-all/i386/compressed-1b.d
+++ b/binutils/testsuite/binutils-all/i386/compressed-1b.d
@@ -10,9 +10,9 @@ There are 5 section headers, starting at offset 0x[0-9a-f]+:
 Section Headers:
   \[Nr\] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
   \[ 0\]                   NULL            00000000 000000 000000 00      0   0  0
-  \[ 1\] .text             PROGBITS        00000000 000040 00001b 00  AX  0   0 16
-  \[ 2\] .data             PROGBITS        00000000 00005b 000000 00  WA  0   0  1
-  \[ 3\] .bss              NOBITS          00000000 00005b 000000 00  WA  0   0  1
-  \[ 4\] .shstrtab         STRTAB          00000000 [0-9a-f]+ 00001c 00   .  0   0  1
+  \[ 1\] .text             PROGBITS        00000000 0000.. 00001b 00  AX  0   0 16
+  \[ 2\] .data             PROGBITS        00000000 0000.. 000000 00  WA  0   0  1
+  \[ 3\] .bss              NOBITS          00000000 0000.. 000000 00  WA  0   0  1
+  \[ 4\] .shstrtab         STRTAB          00000000 0000.. 00001c 00  ..  0   0  1
 Key to Flags:
 #...
diff --git a/binutils/testsuite/binutils-all/i386/compressed-1c.d b/binutils/testsuite/binutils-all/i386/compressed-1c.d
index 1e1a18e7786..f65e8cf2037 100644
--- a/binutils/testsuite/binutils-all/i386/compressed-1c.d
+++ b/binutils/testsuite/binutils-all/i386/compressed-1c.d
@@ -10,9 +10,9 @@ There are 5 section headers, starting at offset 0x[0-9a-f]+:
 Section Headers:
   \[Nr\] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
   \[ 0\]                   NULL            00000000 000000 000000 00      0   0  0
-  \[ 1\] .text             PROGBITS        00000000 000040 00001b 00  AX  0   0 16
-  \[ 2\] .data             PROGBITS        00000000 00005b 000000 00  WA  0   0  1
-  \[ 3\] .bss              NOBITS          00000000 00005b 000000 00  WA  0   0  1
-  \[ 4\] .shstrtab         STRTAB          00000000 [0-9a-f]+ 00001c 00 .* 0   0  1
+  \[ 1\] .text             PROGBITS        00000000 0000.. 00001b 00  AX  0   0 16
+  \[ 2\] .data             PROGBITS        00000000 0000.. 000000 00  WA  0   0  1
+  \[ 3\] .bss              NOBITS          00000000 0000.. 000000 00  WA  0   0  1
+  \[ 4\] .shstrtab         STRTAB          00000000 0000.. 00001c 00  ..  0   0  1
 Key to Flags:
 #...
diff --git a/binutils/testsuite/binutils-all/readelf.s b/binutils/testsuite/binutils-all/readelf.s
index ff37acb4da8..5a1f320c6e1 100644
--- a/binutils/testsuite/binutils-all/readelf.s
+++ b/binutils/testsuite/binutils-all/readelf.s
@@ -10,7 +10,7 @@ Section Headers:
 # MIPS targets put .rela.text here.
 #...
  +\[ .\] .* +PROGBITS +00000000 0000(3c|40|44|48|50) 0000(04|10) 00 +WA +0 +0 +(.|..)
- +\[ .\] .* +NOBITS +00000000 0000(40|44|48|4c|60) 000000 00 +WA +0 +0 +(.|..)
+ +\[ .\] .* +NOBITS +00000000 0+[0-9a-f]+ 000000 00 +WA +0 +0 +(.|..)
 # ARM targets put .ARM.attributes here.
 # MIPS targets put .reginfo, .mdebug, .MIPS.abiflags and .gnu.attributes here.
 # v850 targets put .call_table_data and .call_table_text here.
diff --git a/gas/testsuite/gas/aarch64/tail_padding.d b/gas/testsuite/gas/aarch64/tail_padding.d
index acb4ff2ff46..12f2f6f06ac 100644
--- a/gas/testsuite/gas/aarch64/tail_padding.d
+++ b/gas/testsuite/gas/aarch64/tail_padding.d
@@ -11,10 +11,10 @@ Section Headers:
        Size              EntSize          Flags  Link  Info  Align
   \[ 0\]                   NULL             0000000000000000  00000000
        0000000000000000  0000000000000000           0     0     0
-  \[ 1\] \.text             PROGBITS         0000000000000000  00000040
+  \[ 1\] \.text             PROGBITS         0000000000000000  000000..
        0000000000000000  0000000000000000  AX       0     0     1
-  \[ 2\] \.data             PROGBITS         0000000000000000  00000040
+  \[ 2\] \.data             PROGBITS         0000000000000000  000000..
        0000000000000008  0000000000000000  WA       0     0     64
-  \[ 3\] \.bss              NOBITS           0000000000000000  00000080
+  \[ 3\] \.bss              NOBITS           0000000000000000  000000..
        000000000000000c  0000000000000000  WA       0     0     64
 #...
diff --git a/gas/testsuite/gas/arm/ehabi-pacbti-m.d b/gas/testsuite/gas/arm/ehabi-pacbti-m.d
index 1b13020835c..dca7abd5b1a 100644
--- a/gas/testsuite/gas/arm/ehabi-pacbti-m.d
+++ b/gas/testsuite/gas/arm/ehabi-pacbti-m.d
@@ -4,7 +4,7 @@
 #readelf: -u
 #target: [is_elf_format]
 
-Unwind section '.ARM.exidx' at offset 0x5c contains 1 entry:
+Unwind section '.ARM.exidx' at offset 0x[0-9a-f]+ contains 1 entry:
 
 0x0: @0x0
   Compact model index: 1
diff --git a/gas/testsuite/gas/ia64/group-1.d b/gas/testsuite/gas/ia64/group-1.d
index a04a5ccf46e..5c712ab5ddd 100644
--- a/gas/testsuite/gas/ia64/group-1.d
+++ b/gas/testsuite/gas/ia64/group-1.d
@@ -8,15 +8,15 @@ Section Headers:
        Size              EntSize          Flags  Link  Info  Align
   \[ 0\]                   NULL             0000000000000000  00000000
        0000000000000000  0000000000000000           0     0     0
-  \[ 1\] \.group            GROUP            0000000000000000  00000040
+  \[ 1\] \.group            GROUP            0000000000000000  [0-9a-f]+
        0000000000000008  0000000000000004           6     6     4
-  \[ 2\] \.text             PROGBITS         0000000000000000  00000050
+  \[ 2\] \.text             PROGBITS         0000000000000000  [0-9a-f]+
        0000000000000000  0000000000000000  AX       0     0     16
-  \[ 3\] \.data             PROGBITS         0000000000000000  00000050
+  \[ 3\] \.data             PROGBITS         0000000000000000  [0-9a-f]+
        0000000000000000  0000000000000000  WA       0     0     1
-  \[ 4\] \.bss              NOBITS           0000000000000000  00000050
+  \[ 4\] \.bss              NOBITS           0000000000000000  [0-9a-f]+
        0000000000000000  0000000000000000  WA       0     0     1
-  \[ 5\] \.text             PROGBITS         0000000000000000  00000050
+  \[ 5\] \.text             PROGBITS         0000000000000000  [0-9a-f]+
        0000000000000010  0000000000000000 AXG       0     0     16
   \[ 6\] \.symtab           SYMTAB           0000000000000000  .*
        00000000000000c0  0000000000000018           7     8     8
diff --git a/gas/testsuite/gas/ia64/group-2.d b/gas/testsuite/gas/ia64/group-2.d
index 52a313a7d6f..91473dfb953 100644
--- a/gas/testsuite/gas/ia64/group-2.d
+++ b/gas/testsuite/gas/ia64/group-2.d
@@ -9,19 +9,19 @@ Section Headers:
        Size              EntSize          Flags  Link  Info  Align
   \[ 0\]                   NULL             0000000000000000  00000000
        0000000000000000  0000000000000000           0     0     0
-  \[ 1\] \.group            GROUP            0000000000000000  00000040
+  \[ 1\] \.group            GROUP            0000000000000000  [0-9a-f]+
        0000000000000014  0000000000000004           9     5     4
-  \[ 2\] \.text             PROGBITS         0000000000000000  00000060
+  \[ 2\] \.text             PROGBITS         0000000000000000  [0-9a-f]+
        0000000000000000  0000000000000000  AX       0     0     16
-  \[ 3\] \.data             PROGBITS         0000000000000000  00000060
+  \[ 3\] \.data             PROGBITS         0000000000000000  [0-9a-f]+
        0000000000000000  0000000000000000  WA       0     0     1
-  \[ 4\] \.bss              NOBITS           0000000000000000  00000060
+  \[ 4\] \.bss              NOBITS           0000000000000000  [0-9a-f]+
        0000000000000000  0000000000000000  WA       0     0     1
-  \[ 5\] \.gnu\.linkonce\.t\.f PROGBITS         0000000000000000  00000060
+  \[ 5\] \.gnu\.linkonce\.t\.f PROGBITS         0000000000000000  [0-9a-f]+
        0000000000000000  0000000000000000 AXG       0     0     16
-  \[ 6\] \.gnu\.linkonce\.ia6 PROGBITS         0000000000000000  00000060
+  \[ 6\] \.gnu\.linkonce\.ia6 PROGBITS         0000000000000000  [0-9a-f]+
        0000000000000010  0000000000000000  AG       0     0     8
-  \[ 7\] \.gnu\.linkonce\.ia6 IA_64_UNWIND     0000000000000000  00000070
+  \[ 7\] \.gnu\.linkonce\.ia6 IA_64_UNWIND     0000000000000000  [0-9a-f]+
        0000000000000018  0000000000000000 ALG       5     5     8
   \[ 8\] \.rela\.gnu\.linkonc RELA             0000000000000000  .*
        0000000000000048  0000000000000018  IG       9     7     8
diff --git a/gas/testsuite/gas/mmix/bspec-2.d b/gas/testsuite/gas/mmix/bspec-2.d
index 2ade9b6d173..02ec04946a5 100644
--- a/gas/testsuite/gas/mmix/bspec-2.d
+++ b/gas/testsuite/gas/mmix/bspec-2.d
@@ -1,11 +1,11 @@
 #readelf: -Sr -T -x1 -x4
 There are 11 section headers, starting at offset .*:
 #...
-  \[ 4\] \.MMIX\.spec_data\.2 PROGBITS         0+  0+48
+  \[ 4\] \.MMIX\.spec_data\.2 PROGBITS         0+  [0-9a-f]+
        0+10  0+           0     0     8
   \[ 5\] \.rela\.MMIX\.spec_d RELA             0+  .*
  +0+30  0+18 +I +8 +4 +8
-  \[ 6\] \.MMIX\.spec_data\.3 PROGBITS         0+  0+58
+  \[ 6\] \.MMIX\.spec_data\.3 PROGBITS         0+  [0-9a-f]+
        0+8  0+           0     0     8
   \[ 7\] \.rela\.MMIX\.spec_d RELA             0+  .*
  +0+18 +0+18 +I +8 +6 +8
diff --git a/ld/testsuite/ld-x86-64/pr27590.rd b/ld/testsuite/ld-x86-64/pr27590.rd
index 19469848c41..55ed17d6f7e 100644
--- a/ld/testsuite/ld-x86-64/pr27590.rd
+++ b/ld/testsuite/ld-x86-64/pr27590.rd
@@ -1,11 +1,11 @@
 #...
-  \[[ 0-9]+\] .gnu.debuglto_.debug_info PROGBITS +0+ 0+28a 0+42 00 +E  0 +0  1
-  \[[ 0-9]+\] .rela.gnu.debuglto_.debug_info RELA +0+ 0+810 0+f0 18 +I 26  17  8
-  \[[ 0-9]+\] .gnu.debuglto_.debug_abbrev PROGBITS +0+ 0+2cc 0+26 00 +E  0 +0  1
-  \[[ 0-9]+\] .gnu.debuglto_.debug_macro PROGBITS +0+ 0+2f2 0+2a 00 +E  0 +0  1
-  \[[ 0-9]+\] .rela.gnu.debuglto_.debug_macro RELA +0+ 0+900 0+60 18 +I 26  20  8
-  \[[ 0-9]+\] .gnu.debuglto_.debug_macro PROGBITS +0+ 0+31c 0+10 00  GE  0 +0  1
-  \[[ 0-9]+\] .rela.gnu.debuglto_.debug_macro RELA +0+ 0+960 0+30 18  IG 26  22  8
-  \[[ 0-9]+\] .gnu.debuglto_.debug_line PROGBITS +0+ 0+32c 0+8a 00 +E  0 +0  1
-  \[[ 0-9]+\] .gnu.debuglto_.debug_str PROGBITS +0+ 0+3b6 0+15c 01 MSE  0 +0  1
+  \[[ 0-9]+\] .gnu.debuglto_.debug_info PROGBITS +0+ [0-9a-f]+ 0+42 00 +E  0 +0  1
+  \[[ 0-9]+\] .rela.gnu.debuglto_.debug_info RELA +0+ [0-9a-f]+ 0+f0 18 +I 26  17  8
+  \[[ 0-9]+\] .gnu.debuglto_.debug_abbrev PROGBITS +0+ [0-9a-f]+ 0+26 00 +E  0 +0  1
+  \[[ 0-9]+\] .gnu.debuglto_.debug_macro PROGBITS +0+ [0-9a-f]+ 0+2a 00 +E  0 +0  1
+  \[[ 0-9]+\] .rela.gnu.debuglto_.debug_macro RELA +0+ [0-9a-f]+ 0+60 18 +I 26  20  8
+  \[[ 0-9]+\] .gnu.debuglto_.debug_macro PROGBITS +0+ [0-9a-f]+ 0+10 00  GE  0 +0  1
+  \[[ 0-9]+\] .rela.gnu.debuglto_.debug_macro RELA +0+ [0-9a-f]+ 0+30 18  IG 26  22  8
+  \[[ 0-9]+\] .gnu.debuglto_.debug_line PROGBITS +0+ [0-9a-f]+ 0+8a 00 +E  0 +0  1
+  \[[ 0-9]+\] .gnu.debuglto_.debug_str PROGBITS +0+ [0-9a-f]+ 0+15c 01 MSE  0 +0  1
 #pass


More information about the Binutils-cvs mailing list