summaryrefslogtreecommitdiff
path: root/apr-1.7.0-deepbind.patch
diff options
context:
space:
mode:
Diffstat (limited to 'apr-1.7.0-deepbind.patch')
-rw-r--r--apr-1.7.0-deepbind.patch60
1 files changed, 60 insertions, 0 deletions
diff --git a/apr-1.7.0-deepbind.patch b/apr-1.7.0-deepbind.patch
new file mode 100644
index 0000000..3a40d22
--- /dev/null
+++ b/apr-1.7.0-deepbind.patch
@@ -0,0 +1,60 @@
+
+Add $APR_DEEPBIND to enable use of RTLD_DEEPBIND in apr_dso_open().
+
+--- apr-1.7.0/dso/unix/dso.c.deepbind
++++ apr-1.7.0/dso/unix/dso.c
+@@ -38,6 +38,8 @@
+ #define DYLD_LIBRARY_HANDLE (void *)-1
+ #endif
+
++static int use_deepbind; /* 0 = unset, 1 = use DEEPBIND, -1, don't use DEEPBIND */
++
+ APR_DECLARE(apr_status_t) apr_os_dso_handle_put(apr_dso_handle_t **aprdso,
+ apr_os_dso_handle_t osdso,
+ apr_pool_t *pool)
+@@ -125,6 +127,12 @@
+ #else
+ int flags = RTLD_NOW | RTLD_GLOBAL;
+ void *os_handle;
++
++ if (use_deepbind == 0)
++ use_deepbind = secure_getenv("APR_DEEPBIND") != NULL ? 1 : -1;
++ if (use_deepbind == 1)
++ flags |= RTLD_DEEPBIND;
++
+ #ifdef _AIX
+ if (strchr(path + 1, '(') && path[strlen(path) - 1] == ')')
+ {
+--- apr-1.7.0/README.deepbind.deepbind
++++ apr-1.7.0/README.deepbind
+@@ -0,0 +1,30 @@
++This distribution of APR contains a modification of the behaviour of
++the apr_dso_open() function which allows users enable the
++"RTLD_DEEPBIND" flag when dlopen() is called.
++
++If the "APR_DEEPBIND" environment variable is set at runtime, the
++RTLD_DEEPBIND flag is always added to the flags passed to dlopen().
++
++With normal use of dlopen(), dynamically loaded objects will use
++global symbols in preference to any symbols defined within the object.
++Using RTLD_DEEPBIND reverses this binding order. See the dlopen(3)
++man page for more information.
++
++This can be useful with Apache httpd, where two different modules are
++loaded like:
++
++1. mod_foo.so uses library "libfoo.so"
++ libfoo.so defines a function "SomeSym"
++2. mod_bar.so uses library "libbar.so"
++ libbar.so defines a different "SomeSym" function
++
++By default, mod_bar or mod_foo would use the "SomeSym" definition from
++the "wrong" library depending on the load order. If RTLD_DEEPBIND is
++used, the "SomeSym" definition will always be mapped to the definition
++from the corresponding dependent library. This can avoid symbol
++conflicts.
++
++There are some risks with using RTLD_DEEPBIND, in particular potential
++issues with modules written in C++. It is not recommended to enable
++$APR_DEEPBIND unless it solves a specific problem and after thorough
++testing of the configuration.