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; }