LD_PRELOADed code before or after exec - different behavior after 6.x

John Hein jhein at symmetricom.com
Fri Aug 24 15:18:12 UTC 2012


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.




More information about the freebsd-hackers mailing list