I forgot to attach the example program

  Here is.

-- 
Vincent Danjean       GPG key ID 0x9D025E87         vdanj...@debian.org
GPG key fingerprint: FC95 08A6 854D DB48 4B9A  8A94 0BF7 7867 9D02 5E87
Unofficial pkgs: http://moais.imag.fr/membres/vincent.danjean/deb.html
APT repo:  deb http://people.debian.org/~vdanjean/debian unstable main

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

extern char** environ;
extern char **_environ;
extern char **__environ;
char** save_environ;
char** save__environ;
char** save___environ;
char* toto;
int saved=0;

extern int fonction ();

int fonction1 () {
	return 1;
}

int fonction2 () {
	return 2;
}

static typeof(fonction) * resolve_fonction (void) {
	saved=1;
	save_environ=environ;
	save__environ=_environ;
	save___environ=__environ;
	toto=getenv("TOTO");
	/* no way to choose between fonction1 and fonction2 with the TOTO envvar */
	char* str="Resolving fonction\n";
	write(2, str, strlen(str));
	return fonction1;
}

int fonction () __attribute__ ((ifunc ("resolve_fonction")));

void print_saved() {
	printf("saved: %d\n", saved);
	if (saved) {
		printf("prev environ: %p\n", save_environ);
		printf("prev _environ: %p\n", save__environ);
		printf("prev __environ: %p\n", save___environ);
		printf("prev TOTO: %s\n", toto);
	}
}

int main() {

	print_saved();
	printf("main environ: %p\n", environ);
	printf("main _environ: %p\n", _environ);
	printf("main __environ: %p\n", __environ);
	printf("main &environ: %p\n", &environ);
	printf("main &_environ: %p\n", &_environ);
	printf("main &__environ: %p\n", &__environ);
	printf("main environ[0]: %s\n", environ[0]);
	printf("main TOTO: %s\n", getenv("TOTO"));
	printf("main value: %d\n", fonction());

	return 0;
}

Reply via email to