x86/mkelf32: account for offset when detecting note segment placement

mkelf32 attempt to check that the program header defined NOTE segment falls
inside of the LOAD segment, as the build-id should be loaded for Xen at
runtime to check.

However the current code doesn't take into account the LOAD program header
segment offset when calculating overlap with the NOTE segment.  This
results in incorrect detection, and the following build error:

arch/x86/boot/mkelf32 --notes xen-syms ./.xen.elf32 0x200000 \
               `nm xen-syms | sed -ne 's/^\([^ ]*\) . __2M_rwdata_end$/0x\1/p'`
Expected .note section within .text section!
Offset 4244776 not within 2910364!

When xen-syms has the following program headers:

Program Header:
    LOAD off    0x0000000000200000 vaddr 0xffff82d040200000 paddr 0x0000000000200000 align 2**21
         filesz 0x00000000002c689c memsz 0x00000000003f7e20 flags rwx
    NOTE off    0x000000000040c528 vaddr 0xffff82d04040c528 paddr 0x000000000040c528 align 2**2
         filesz 0x0000000000000024 memsz 0x0000000000000024 flags r--

Account for the program header offset of the LOAD segment when checking
whether the NOTE segments is contained within.  Also fix the logic to
ensure the NOTE segments is fully contained between the LOAD segment.

Fixes: a353cab905 ('build_id: Provide ld-embedded build-ids')
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
master commit: 6e5fed7cb6
master date: 2025-03-20 12:28:30 +0100
This commit is contained in:
Roger Pau Monné authored and Jan Beulich committed 2025-03-27 15:02:20 +01:00
1 parent ce591a92ca
commit ed87d5f1bf
1 file changed
+5 -3
+5 -3
View File
@@ -366,11 +366,13 @@ int main(int argc, char **argv)
note_sz = in64_phdr.p_memsz;
note_base = in64_phdr.p_vaddr - note_base;
if ( in64_phdr.p_offset > dat_siz || offset > in64_phdr.p_offset )
if ( in64_phdr.p_offset < offset ||
in64_phdr.p_offset + in64_phdr.p_filesz > offset + dat_siz )
{
fprintf(stderr, "Expected .note section within .text section!\n" \
"Offset %"PRId64" not within %d!\n",
in64_phdr.p_offset, dat_siz);
".note: [%"PRIx64", %"PRIx64") .text: [%x, %x)\n",
in64_phdr.p_offset, in64_phdr.p_offset + in64_phdr.p_filesz,
offset, offset + dat_siz);
return 1;
}
/* Gets us the absolute offset within the .text section. */
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.