diff options
Diffstat (limited to 'poky/meta/recipes-devtools/patchelf/patchelf/alignmentfix.patch')
-rw-r--r-- | poky/meta/recipes-devtools/patchelf/patchelf/alignmentfix.patch | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/poky/meta/recipes-devtools/patchelf/patchelf/alignmentfix.patch b/poky/meta/recipes-devtools/patchelf/patchelf/alignmentfix.patch new file mode 100644 index 000000000..a06876e50 --- /dev/null +++ b/poky/meta/recipes-devtools/patchelf/patchelf/alignmentfix.patch @@ -0,0 +1,44 @@ +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. + +Upstream-Status: Submitted [https://github.com/NixOS/patchelf/pull/274] +Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> + +Index: git/src/patchelf.cc +=================================================================== +--- git.orig/src/patchelf.cc ++++ git/src/patchelf.cc +@@ -1010,8 +1010,9 @@ void ElfFile<ElfFileParamNames>::normali + size_t size = 0; + for (const auto & shdr : shdrs) { + if (rdi(shdr.sh_type) != SHT_NOTE) continue; +- if (rdi(shdr.sh_offset) != curr_off) continue; ++ if (rdi(shdr.sh_offset) != roundUp(curr_off, rdi(shdr.sh_addralign))) continue; + size = rdi(shdr.sh_size); ++ curr_off = roundUp(curr_off, rdi(shdr.sh_addralign)); + break; + } + if (size == 0) |