This is precisely how the Linux kernel's own bzImage decompression stub and hobby kernels like xv6-derivatives interpret PT_LOAD program headers to place segments at p_paddr before jumping to e_entry. Getting the p_memsz vs p_filesz distinction wrong (forgetting to zero the BSS gap) is a textbook bug that leaves global variables containing stale disk bytes instead of zero.