illegal instruction - create compile variants ?

Jan Kratochvil jan.kratochvil at redhat.com
Tue May 3 01:11:46 UTC 2011


On Mon, 02 May 2011 17:24:53 +0200, Kevin Kofler wrote:
> Jan Kratochvil wrote:
> > There is the STT_GNU_IFUNC feature implemented for it - the indirect is
> > handled by linker without an additional indirect overhead if applied for a
> > shared library function. For apps it works in a similar way as normal
> > indirect.
> 
> Are there any caveats (initialization order or so) when using this feature? 

Yes, a bit.  STT_GNU_IFUNC relocations are sorted as last in the library to be
relocated.  But still they are called before any static initializers (static
constructors), the sample code below outputs:
	resolver
	constructor
	main
	func1
	destructor


> E.g. would one get away with calling something like
> http://api.kde.org/4.0-api/kdelibs-apidocs/solid/html/tutorial3.html (i.e. 
> Solid::Processor::instructionSets) in the ifunc or would trying to call such 
> C++ classes lead to errors or unpredictable behavior?

Unless there are static initializers it should work.


> And I presume this is available on ELF glibc targets only, isn't it?

It is GNU/Linux feature, unrelated to glibc (glibc is just one of its users).

STT_GNU_IFUNC is ELF feature and it is in STT_LOOS..STT_HIOS, therefore it
needs ELFOSABI_LINUX.


Thanks,
Jan


------------------------------------------------------------------------------

#include <stdio.h>
#include <time.h>

class C
{
public:
  C() { puts ("constructor"); }
  ~C() { puts ("destructor"); }
} c;

static void
func1 (void)
{
  puts ("func1");
}

static void
func2 (void)
{
  puts ("func2");
}

typedef void (*func_t) (void);

asm (".type _Z9gnu_ifuncv, @gnu_indirect_function");

func_t
gnu_ifunc (void)
{
  puts ("resolver");
  return time (NULL) & 1 ? func1 : func2;
}

int
main (void)
{
  puts ("main");
  gnu_ifunc ();
  return 0;
}


More information about the devel mailing list