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