On 23 July 2017 at 21:44, Peter Maydell <peter.mayd...@linaro.org> wrote:
> Does anybody know (a) what the ELF spec mandates
> for overlapping segments and (b) what the history
> and rationale for QEMU's overlapping-roms check is?

Having asked around a bit, it appears that it's fairly common
in the embedded world to treat the ELF "vaddr" as the "execution
address" and the ELF "paddr" as "load address", with the
size of the data to be loaded at the load address being
specified by "filesz". The typical application is where
an application is packed into ROM -- the ROM addresses are
the paddr values, and something at runtime will unpack
everything into the vaddr addresses where it eventually
runs from (and handle the zero-initialization).

The awkward part is that this is more pervasive convention
rather than actually written down as a specification, and
there's no way to tell whether a particular ELF file is
using it or not.

My current theory is that we can handle this with:
 * load the segment with the assumption that the
   memsz is the size to use (zero-filling), as
   we do now
 * _unless_ that would make it overlap with the following
   segment, in which case use the filesz

That ought to make all the ELF files we currently load
OK continue to load with the same semantics, and also
permit loading of ELF files using the ARM embedded
conventions. In some cases of ELF files using the
embedded convention but not tightly packing their
segments into ROM it will zero out some of the gaps
between segments, but I think that should be harmless.

thanks
-- PMM

Reply via email to