Skip to content

Commit 2d0e0b9

Browse files
committed
patchelf: Fix alignment issues with contiguous note sections
If a binary has multiple SHT_NOTE sections and corresponding PT_NOTE headers, we can see the error: patchelf: cannot normalize PT_NOTE segment: non-contiguous SHT_NOTE sections if the SHT_NOTE sections aren't sized to end on aligned boundaries. An example would be a binary with: [ 2] .note.ABI-tag NOTE 00000000000002f4 000002f4 0000000000000020 0000000000000000 A 0 0 4 [ 3] .note.gnu.propert NOTE 0000000000000318 00000318 0000000000000030 0000000000000000 A 0 0 8 [ 4] .note.gnu.build-i NOTE 0000000000000348 00000348 0000000000000024 0000000000000000 A 0 0 4 NOTE 0x0000000000000318 0x0000000000000318 0x0000000000000318 0x0000000000000030 0x0000000000000030 R 0x8 NOTE 0x00000000000002f4 0x00000000000002f4 0x00000000000002f4 0x0000000000000078 0x0000000000000074 R 0x4 since the PT_NOTE section at 2f4 covers [2] and [3] but the code calclates curr_off should be 314, not the 318 in the binary. This is an alignment issue. To fix this, we need to round curr_off to the next section alignment. Signed-off-by: Richard Purdie <[email protected]>
1 parent f376fe6 commit 2d0e0b9

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

src/patchelf.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1000,8 +1000,9 @@ void ElfFile<ElfFileParamNames>::normalizeNoteSegments()
10001000
size_t size = 0;
10011001
for (const auto & shdr : shdrs) {
10021002
if (rdi(shdr.sh_type) != SHT_NOTE) continue;
1003-
if (rdi(shdr.sh_offset) != curr_off) continue;
1003+
if (rdi(shdr.sh_offset) != roundUp(curr_off, rdi(shdr.sh_addralign))) continue;
10041004
size = rdi(shdr.sh_size);
1005+
curr_off = roundUp(curr_off, rdi(shdr.sh_addralign));
10051006
break;
10061007
}
10071008
if (size == 0)

0 commit comments

Comments
 (0)