* 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
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to