Problem with PHP as a plugin (C++) using embed sapi
| From: | Olivier Hoareau | Date: | Fri, 14 Oct 2011 08:49:38 +0000 |
| Subject: | Problem with PHP as a plugin (C++) using embed sapi | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-55804@lists.php.net to get a copy of this message | ||
* My use case :
[A] is a main program written in C++
[B] is a C++ "plugin" of [A], compiled in a shared library dynamically loaded (dlopen-like
functions)
[CX] are a libphpX.so C shared libraries compiled with "--enable-embed", where
"X" is the PHP version number (5.4, 5.3, ..., 5.0)
User calls [A] with the version of PHP he/she wants to use (ex: 5.4), [A] loads [B] using dynamic
loading (dlopen-like functions) and propagate the requested PHP version number, and when executed,
[B] tries to load this specific version of [CX] (let's say [C5.4]) using dlopen-like functions.
* My status :
[A] is successfully compiled in program "a"
[B] is successfully compiled in shared library in file libb.so
C5.4 is successfully compiled in shared library libphp5.4.so (using ../configure --disable-all
--enable-embed && make)
* My probem :
When trying to load B from A, I got the error "unknown symbol executor_globals_id" when
calling dlopen("libb.so").
executor_globals seems to be a global variable of libphp5.so (there are several other global
variables in libphp5.so).
I can't use dlsym() because it is a dlopen() failure.
I tried refactoring my code using PHP functions (in [B]), and I have also the same error with other
global variables (such as php_embed_module, ...)
I tried to define executor_globals_id and it worked, but I felt on next global variables error.
I want to be able not to define all PHP global variable in my [B] plugin if possible.
* My environment :
MacOSX 10.7 64 bits
* Extra information :
[A] LDFLAGS = -flat_namespace -undefined suppress
[B] LDFLAGS = -flat_namespace -undefined suppress
dlopen() is used with "RTLD_LAZY | RTLD_GLOBAL"
Do you have an idea on how to reach my use case ?
Thanks !
Olivier Hoareau