Query regarding ELF loader arg style
Vivek Goyal
vgoyal at redhat.com
Thu Jan 16 10:13:02 EST 2014
On Tue, Jan 14, 2014 at 05:42:13PM -0800, Eric W. Biederman wrote:
> Vivek Goyal <vgoyal at redhat.com> writes:
>
> > Hi Eric,
> >
> > I am looking at kexec ELF loader code and wondering what are arg style
> > options.
> >
> > #define ARG_STYLE_ELF 0
> > #define ARG_STYLE_LINUX 1
> > #define ARG_STYLE_NONE 2
> >
> >
> > I have looked at them many a times but frankly never fully understood
> > what do they represent and what's the intention behind them. Can you
> > please elaborate a bit on this.
>
> There is no standard of what kind of arguments a standalone ELF
> executable will receive from a bootloader.
>
> Which means that in practice to support different OS's you either need
> to pass nothing or make something up.
>
> ARG_STYLE_ELF is my own invention and a sad attempt at coming up with an
> OS agnostic standard.
>
> ARG_STYLE_LINUX is an ELF image receiving the same arguments as the
> linux kernel. It is a mess but it is reasonably well documented.
Hi Eric,
Even ARG_STYLE_LINUX seems to be making assumptions.
For example, look at init_linux_parameters() in
kexec-tools/kexec/arch/i386/x86-linux-setup.c.
void init_linux_parameters(struct x86_linux_param_header *real_mode)
{
/* Fill in the values that are usually provided by the kernel. */
/* Boot block magic */
memcpy(real_mode->header_magic, "HdrS", 4);
real_mode->protocol_version = 0x0206;
real_mode->initrd_addr_max = DEFAULT_INITRD_ADDR_MAX;
real_mode->cmdline_size = COMMAND_LINE_SIZE;
}
- We have no idea what's the max address we can load initrd at. So we make
assumptions.
- We have no idea what's the maximum command line size kernel suppports. So
we make assumptions. The other side affect of this is that we can't do
error handling properly. I can't tell user back that you are passing
command line which is longer than what kernel can support.
- ELF does not tell anything whether it is self relocating or not. So we
are forced to load it at a address it has been compiled for (In case of
kdump). And that address is already occupied by current running kernel
so it does not work.
For the time being I have written a simple ELF loader along the lines of
kexec-tools. It defaults to ARG_STYLE_LINUX and works only with kexec and
not kexec on panic.
I have also made purgatory a stand alone relocatable object and now
purgatory is doing hash verification.
I am cleaning up the patches and will soon for another round of review
pretty soon.
Thanks
Vivek
More information about the kexec
mailing list