SH FDPIC ABI spec/binutils and kernel conflict on flag definitions

Nick Clifton nickc@redhat.com
Thu Sep 10 11:57:00 GMT 2015


Hi Rich,

> In the ELF Header part of the SH FDPIC ABI document, it's stated that
> EF_SH_FDPIC|EF_SH_PIC means each LOAD segment can be independently
> positioned, while EF_SH_FDPIC by itself (without EF_SH_PIC) means the
> relative position of LOAD segments with respect to each other is fixed
> (like in normal ELF usage). This seems to match what binutils outputs.
>
> However the kernel contains the code (arch/sh/include/asm/elf.h):
>
> #define elf_check_const_displacement(x) ((x)->e_flags & EF_SH_PIC)
>
> and (fs/binfmt_elf_fdpic.c):
>
> 	if (elf_check_const_displacement(&exec_params.hdr))
> 		exec_params.flags |= ELF_FDPIC_FLAG_CONSTDISP;
>
> which does exactly the opposite: the presence of the EF_SH_PIC flag,
> rather than absence of it, causes the kernel to treat the binary as
> one requiring "constant displacement" between LOAD segments.
>
> If my analysis is correct, how should this be fixed? It seems to me
> the kernel is clearly wrong, but it might also be considered the de
> facto ABI.

I think that adopting the kernel's behaviour as correct would set a 
dangerous precedent.  A published ABI should be followed, and if the 
kernel does not implement it, then the kernel is wrong.

> Is there any way forward that allows fixing this bug (which
> defeats the whole purpose of FDPIC) without breaking existing usage?

Maybe a kernel tuning option ?  (I am not familiar with kernel 
development so maybe this idea is a non-starter).

> Or is there no existing usage to care about?

I could not say for sure, but I imagine that there must be at least some 
people who are using SH linux at the moment.

Cheers
   Nick



More information about the Binutils mailing list