Re: Re: restore user opcode handler in PHP
| From: | yoram bar haim | Date: | Mon, 13 Feb 2012 09:57:31 +0000 |
| Subject: | Re: Re: restore user opcode handler in PHP | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-57826@lists.php.net to get a copy of this message | ||
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 <yoram.b@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