Indeed, when using dlsym the value is recreated. now the question is what happens at apache restart (on mac) that causes incorrect behavior. a-priory to that question, static initializers can not be trusted on some situations.
On Monday, February 13, 2012 11:44:15 AM Gwynne Raskind wrote: > On Mon, Feb 13, 2012 at 04:38, yoram bar haim <yora...@zend.com> wrote: > > Here is a simple test program that reproduce the issue on mac: > [snip] > > > shell> gcc -o lib.so -shared lib.c > > shell> gcc -o main main.c lib.so > > shell> ./main > > This example is flawed. > > The manpage for dlclose(3) on Darwin explicitly states that a library > linked by the executable will never be unloaded. You link directly to > the library here. Also, you use prototypes of the library's functions > rather than calling dlsym(3), forcing you to link to the library, > defeating the entire point of loading it with dlopen(3) in the first > place. I've included a test which does not show the issue at the > bottom of this message. > > (As a side note of interest, OS X has historically always had issues > with unloading images from the address space; for example, even in > Lion, if you unload an image containing Objective-C symbols, you stand > a pretty good chance of crashing. Image unloading simply didn't exist > at all in any useful form before Leopard.) > > -- Gwynne Raskind > > /* dylib.c - clang dylib.c -o dylib.dylib -dynamiclib */ > static int var = 0; > extern int getVar(void); > extern void setVar(int value); > int getVar(void) { return var; } > void setVar(int value) { var = value; } > > /* loader.c - clang loader.c -o loader */ > #include <stdio.h> > #include <dlfcn.h> > int main(int argc, char **argv) > { > void *libh = dlopen("dylib.dylib", 0); > int (*getfunc)() = dlsym(libh, "getVar"); > void (*setfunc)(int) = dlsym(libh, "setVar"); > > printf("First load value: %d\n", getfunc()); > setfunc(5); > printf("First load set value: %d\n", getfunc()); > dlclose(libh); > libh = dlopen("dylib.dylib", 0); > getfunc = dlsym(libh, "getVar"); > setfunc = dlsym(libh, "setVar"); > printf("Second load value: %d\n", getfunc()); > return 0; > } > > /* output */ > $ uname -v ; clang --version ; ./loader > Darwin Kernel Version 11.3.0: Thu Jan 12 18:47:41 PST 2012; > root:xnu-1699.24.23~1/RELEASE_X86_64 > clang version 3.0 (tags/RELEASE_30/final) > First load value: 0 > First load set value: 5 > Second load value: 0 -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php