[v2,1/2] bfd/ELF: restrict file alignment for object files

Message ID 2883a774-5534-4e0f-9c9d-b5eec3d5d43b@suse.com
State New
Headers
Series bfd/ELF: section placement withing object files |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_binutils_check--master-aarch64 success Test passed
linaro-tcwg-bot/tcwg_binutils_check--master-arm success Test passed

Commit Message

Jan Beulich Oct. 4, 2024, 7:31 a.m. UTC
  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.
---
RFC: Question is whether this minimal alignment shouldn't be applied in
     all cases, i.e. also when incoming "align" is "true".

The Arm64 test being adjusted has an imo misleading name: I first
thought I broke something. Only when going back to the commit that
introduced it, I found that the test is about the _absence_ of tail
padding. Would people mind if I inserted e.g. "no" on the #name line?
---
v2: Replace heuristic in _bfd_elf_assign_file_position_for_section().
  

Comments

Matthias Klose Dec. 10, 2024, 10:46 a.m. UTC | #1
On 04.10.24 09:31, Jan Beulich wrote:
> 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.
> ---
> RFC: Question is whether this minimal alignment shouldn't be applied in
>       all cases, i.e. also when incoming "align" is "true".
> 
> The Arm64 test being adjusted has an imo misleading name: I first
> thought I broke something. Only when going back to the commit that
> introduced it, I found that the test is about the _absence_ of tail
> padding. Would people mind if I inserted e.g. "no" on the #name line?
> ---
> v2: Replace heuristic in _bfd_elf_assign_file_position_for_section().

this causes PR gas/32435, a kernel build failure for 
arm-linux-gnueabihf.  Apparently the modpost tool in the kernel doesn't 
expect this change, and terminates with a bus error when modules are 
built with this change (when running an aarch64 kernel). Not sure where 
to fix that ...

Reverting this fix lets the kernel (6.11) build again.

Matthias
  
Jan Beulich Dec. 10, 2024, 11:02 a.m. UTC | #2
On 10.12.2024 11:46, Matthias Klose wrote:
> On 04.10.24 09:31, Jan Beulich wrote:
>> 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.
>> ---
>> RFC: Question is whether this minimal alignment shouldn't be applied in
>>       all cases, i.e. also when incoming "align" is "true".
>>
>> The Arm64 test being adjusted has an imo misleading name: I first
>> thought I broke something. Only when going back to the commit that
>> introduced it, I found that the test is about the _absence_ of tail
>> padding. Would people mind if I inserted e.g. "no" on the #name line?
>> ---
>> v2: Replace heuristic in _bfd_elf_assign_file_position_for_section().
> 
> this causes PR gas/32435, a kernel build failure for arm-linux-gnueabihf.  Apparently the modpost tool in the kernel doesn't expect this change, and terminates with a bus error when modules are built with this change (when running an aarch64 kernel). Not sure where to fix that ...

Neither here nor in the bug you say which specific section(s) it is (are)
causing this effect. I wonder in particular whether the RFC remark still
in context above is related. I would have been suspecting .modinfo, but
that section, for the specific case mentioned in the bug, even end up
getting better alignment now.

That said, the diff in the bug doesn't appear to show anything that would
violate the ELF spec.

Jan
  
Matthias Klose Dec. 10, 2024, 4:17 p.m. UTC | #3
On 10.12.24 12:02, Jan Beulich wrote:
> On 10.12.2024 11:46, Matthias Klose wrote:
>> On 04.10.24 09:31, Jan Beulich wrote:
>>> 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.
>>> ---
>>> RFC: Question is whether this minimal alignment shouldn't be applied in
>>>        all cases, i.e. also when incoming "align" is "true".
>>>
>>> The Arm64 test being adjusted has an imo misleading name: I first
>>> thought I broke something. Only when going back to the commit that
>>> introduced it, I found that the test is about the _absence_ of tail
>>> padding. Would people mind if I inserted e.g. "no" on the #name line?
>>> ---
>>> v2: Replace heuristic in _bfd_elf_assign_file_position_for_section().
>>
>> this causes PR gas/32435, a kernel build failure for arm-linux-gnueabihf.  Apparently the modpost tool in the kernel doesn't expect this change, and terminates with a bus error when modules are built with this change (when running an aarch64 kernel). Not sure where to fix that ...
> 
> Neither here nor in the bug you say which specific section(s) it is (are)
> causing this effect. I wonder in particular whether the RFC remark still
> in context above is related. I would have been suspecting .modinfo, but
> that section, for the specific case mentioned in the bug, even end up
> getting better alignment now.

I don't know. I have forwarded that to our kernel people who saw that 
issue in the first place.

> That said, the diff in the bug doesn't appear to show anything that would
> violate the ELF spec.

right, I said "Not sure where to fix that ..."

Matthias
  

Patch

--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4562,10 +4562,23 @@  align_file_position (file_ptr off, int a
 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;
@@ -4653,18 +4666,18 @@  _bfd_elf_compute_section_file_positions
       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;
 
@@ -6538,8 +6551,8 @@  assign_file_positions_for_non_load_secti
 	  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)
@@ -6556,7 +6569,7 @@  assign_file_positions_for_non_load_secti
 	       || 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;
 
@@ -6793,7 +6806,8 @@  assign_file_positions_except_relocs (bfd
 	      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;
@@ -7008,7 +7022,7 @@  _bfd_elf_assign_file_positions_for_non_l
   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)
@@ -7076,7 +7090,10 @@  _bfd_elf_assign_file_positions_for_non_l
 	      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);
 	}
     }
 
@@ -7085,11 +7102,10 @@  _bfd_elf_assign_file_positions_for_non_l
   _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;
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -2540,7 +2540,7 @@  extern long _bfd_elf_link_lookup_local_d
 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 *);
 
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -12914,7 +12914,7 @@  bfd_elf_final_link (bfd *abfd, struct bf
     {
       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.
@@ -13358,7 +13358,7 @@  bfd_elf_final_link (bfd *abfd, struct bf
 	      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))
@@ -13382,7 +13382,7 @@  bfd_elf_final_link (bfd *abfd, struct bf
       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
--- 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
 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:
 #...
--- 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
 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:
 #...
--- 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.
--- 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
 #...
--- 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
--- 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
--- 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
--- 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
--- 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