Date: Fri, 24 Aug 2012 09:17:22 -0600 From: John Hein <jhein@symmetricom.com> To: hackers@freebsd.org Subject: LD_PRELOADed code before or after exec - different behavior after 6.x Message-ID: <20535.39682.330250.337503@gromit.timing.com>
next in thread | raw e-mail | index | archive | help
head sl.cc pe.c ==> sl.cc <== #include <cstdio> #include <cstdlib> class C { public: C(){ printf("C\n"); unsetenv("XXX"); } }; static C c; ==> pe.c <== #include <stdio.h> #include <stdlib.h> int main() { char *p=getenv("XXX"); if (p != NULL) printf("XXX=%s\n",p); return 0; } % g++ -fpic -shared sl.cc -o sl.so % gcc pe.c -o pe 7.x & 8.x ... % sh -c 'XXX=1 LD_PRELOAD=$(pwd)/sl.so pe' C XXX=1 6.x & 4.x ... % sh -c 'XXX=1 LD_PRELOAD=$(pwd)/sl.so pe' C In 6.x and earlier (fedora 16, too), the unsetenv clears the XXX env var apparently in time to affect the exec'd process. In 8.x & 9.x, it seems the environment is set and passed to the exec'd process and the LD_PRELOADed code does not affect that despite its best efforts. It seems to me that 6.x behavior is more correct, but I'm seeking opinions before contemplating if / how to put together a fix.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20535.39682.330250.337503>