From d937140c61575709808bb5459238207686a7cba6 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 12 Feb 2002 23:41:25 +0000 Subject: [PATCH] Use RTLD_NOW, not RTLD_LAZY, as binding mode for dlopen() on all platforms. This restores the Linux behavior to what it was in PG 7.0 and 7.1, and causes other platforms to agree. (Other well-tested platforms like HPUX were doing it this way already.) Per pghackers discussion over the past month or so. --- src/backend/port/dynloader/README.dlfcn.aix | 4 +-- src/backend/port/dynloader/aix.h | 2 +- src/backend/port/dynloader/bsdi.h | 23 ++++++++++--- src/backend/port/dynloader/dgux.h | 17 ++++++++-- src/backend/port/dynloader/freebsd.h | 17 +++++++--- src/backend/port/dynloader/irix5.h | 22 ++++++++++--- src/backend/port/dynloader/linux.h | 18 +++++++++-- src/backend/port/dynloader/netbsd.h | 21 +++++++++--- src/backend/port/dynloader/openbsd.h | 20 ++++++++++-- src/backend/port/dynloader/osf.h | 17 ++++++---- src/backend/port/dynloader/sco.h | 22 +++++++++---- src/backend/port/dynloader/solaris.h | 36 +++++++++++++++++---- src/backend/port/dynloader/sunos4.h | 20 +++++++++--- src/backend/port/dynloader/svr4.h | 26 +++++++++++---- src/backend/port/dynloader/univel.h | 20 +++++++++--- src/backend/port/dynloader/unixware.h | 20 +++++++++--- src/backend/port/dynloader/win.h | 20 +++++++++--- 17 files changed, 256 insertions(+), 69 deletions(-) diff --git a/src/backend/port/dynloader/README.dlfcn.aix b/src/backend/port/dynloader/README.dlfcn.aix index f64446d49b..e7519086d1 100644 --- a/src/backend/port/dynloader/README.dlfcn.aix +++ b/src/backend/port/dynloader/README.dlfcn.aix @@ -39,8 +39,8 @@ table. If the path does not contain a '/' character, dlopen will search for the module using the LIBPATH environment variable. It returns an opaque handle to the module or NULL on error. The mode parameter can be either RTLD_LAZY (for lazy function binding) or RTLD_NOW for immediate -function binding. The AIX implementation currently does treat RTLD_NOW -the same as RTLD_LAZY. The flag RTLD_GLOBAL might be or'ed into the +function binding. The AIX implementation currently behaves as RTLD_NOW +even if RTLD_LAZY is specified. The flag RTLD_GLOBAL might be or'ed into the mode parameter to allow loaded modules to bind to global variables or functions in other loaded modules loaded by dlopen(). If RTLD_GLOBAL is not specified, only globals from the main part of the executable or diff --git a/src/backend/port/dynloader/aix.h b/src/backend/port/dynloader/aix.h index 7131acd019..3a47397dd1 100644 --- a/src/backend/port/dynloader/aix.h +++ b/src/backend/port/dynloader/aix.h @@ -57,7 +57,7 @@ int dlclose(); #include "utils/dynamic_loader.h" -#define pg_dlopen(f) dlopen((f), RTLD_LAZY | RTLD_GLOBAL) +#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym dlsym #define pg_dlclose dlclose #define pg_dlerror dlerror diff --git a/src/backend/port/dynloader/bsdi.h b/src/backend/port/dynloader/bsdi.h index 1af6d3d3f5..8a3fc489fa 100644 --- a/src/backend/port/dynloader/bsdi.h +++ b/src/backend/port/dynloader/bsdi.h @@ -1,12 +1,12 @@ /*------------------------------------------------------------------------- * - * Dynamic loader interface for BSD/OS - * + * bsdi.h + * Dynamic loader interface for BSD/OS * * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * port_protos.h,v 1.2 1995/05/25 22:51:03 andrew Exp + * $Id$ * *------------------------------------------------------------------------- */ @@ -19,7 +19,21 @@ #ifdef HAVE_DLOPEN #include -#define pg_dlopen(f) dlopen((f), RTLD_LAZY | RTLD_GLOBAL) + +/* + * In some older systems, the RTLD_NOW flag isn't defined and the mode + * argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted + * if available, but it doesn't exist everywhere. + * If it doesn't exist, set it to 0 so it has no effect. + */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif + +#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym dlsym #define pg_dlclose dlclose #define pg_dlerror dlerror @@ -32,6 +46,7 @@ do { \ dld_unlink_by_file(handle, 1); \ free(handle); \ } while (0) + #endif /* not HAVE_DLOPEN */ #endif /* PORT_PROTOS_H */ diff --git a/src/backend/port/dynloader/dgux.h b/src/backend/port/dynloader/dgux.h index 31a854fb2e..86b3d1b5b3 100644 --- a/src/backend/port/dynloader/dgux.h +++ b/src/backend/port/dynloader/dgux.h @@ -21,9 +21,22 @@ * this dynamic loader uses the system dynamic loading interface for shared * libraries (ie. dlopen/dlsym/dlclose). The user must specify a shared * library as the file to be dynamically loaded. - * */ -#define pg_dlopen(f) dlopen((f), RTLD_LAZY | RTLD_GLOBAL) + +/* + * In some older systems, the RTLD_NOW flag isn't defined and the mode + * argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted + * if available, but it doesn't exist everywhere. + * If it doesn't exist, set it to 0 so it has no effect. + */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif + +#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym dlsym #define pg_dlclose dlclose #define pg_dlerror dlerror diff --git a/src/backend/port/dynloader/freebsd.h b/src/backend/port/dynloader/freebsd.h index 10275e8020..dcf3c3eb0f 100644 --- a/src/backend/port/dynloader/freebsd.h +++ b/src/backend/port/dynloader/freebsd.h @@ -1,8 +1,7 @@ /*------------------------------------------------------------------------- * - * port_protos.h - * port-specific prototypes for NetBSD 1.0 - * + * freebsd.h + * port-specific prototypes for FreeBSD * * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California @@ -21,7 +20,6 @@ #include "utils/dynamic_loader.h" -/* dynloader.c */ /* * Dynamic Loader on NetBSD 1.0. * @@ -35,11 +33,20 @@ * NetBSD (like 1.0, and 1.0A pre June 1995) have no dlerror.) */ +/* + * In some older systems, the RTLD_NOW flag isn't defined and the mode + * argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted + * if available, but it doesn't exist everywhere. + * If it doesn't exist, set it to 0 so it has no effect. + */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif #ifndef RTLD_GLOBAL #define RTLD_GLOBAL 0 #endif -#define pg_dlopen(f) BSD44_derived_dlopen((f), RTLD_LAZY | RTLD_GLOBAL) +#define pg_dlopen(f) BSD44_derived_dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym BSD44_derived_dlsym #define pg_dlclose BSD44_derived_dlclose #define pg_dlerror BSD44_derived_dlerror diff --git a/src/backend/port/dynloader/irix5.h b/src/backend/port/dynloader/irix5.h index 87efa317f7..cf93b10e17 100644 --- a/src/backend/port/dynloader/irix5.h +++ b/src/backend/port/dynloader/irix5.h @@ -1,13 +1,13 @@ /*------------------------------------------------------------------------- * - * port_protos.h + * irix5.h * port-specific prototypes for Irix 5 * * * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * port_protos.h,v 1.2 1995/03/17 06:40:18 andrew Exp + * $Id$ * *------------------------------------------------------------------------- */ @@ -17,16 +17,28 @@ #include #include "utils/dynamic_loader.h" -/* dynloader.c */ /* * Dynamic Loader on SunOS 4. * * this dynamic loader uses the system dynamic loading interface for shared * libraries (ie. dlopen/dlsym/dlclose). The user must specify a shared * library as the file to be dynamically loaded. - * */ -#define pg_dlopen(f) dlopen((f), RTLD_LAZY | RTLD_GLOBAL) + +/* + * In some older systems, the RTLD_NOW flag isn't defined and the mode + * argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted + * if available, but it doesn't exist everywhere. + * If it doesn't exist, set it to 0 so it has no effect. + */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif + +#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym dlsym #define pg_dlclose dlclose #define pg_dlerror dlerror diff --git a/src/backend/port/dynloader/linux.h b/src/backend/port/dynloader/linux.h index 938ef07246..480d65f46e 100644 --- a/src/backend/port/dynloader/linux.h +++ b/src/backend/port/dynloader/linux.h @@ -1,6 +1,7 @@ /*------------------------------------------------------------------------- * - * Dynamic loader interface for Linux + * linux.h + * Port-specific prototypes for Linux * * * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group @@ -35,7 +36,20 @@ do { \ #else /* HAVE_DLOPEN */ -#define pg_dlopen(f) dlopen((f), RTLD_LAZY | RTLD_GLOBAL) +/* + * In some older systems, the RTLD_NOW flag isn't defined and the mode + * argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted + * if available, but it doesn't exist everywhere. + * If it doesn't exist, set it to 0 so it has no effect. + */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif + +#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym dlsym #define pg_dlclose dlclose #define pg_dlerror dlerror diff --git a/src/backend/port/dynloader/netbsd.h b/src/backend/port/dynloader/netbsd.h index 04fad271a3..bd5ce7d8d4 100644 --- a/src/backend/port/dynloader/netbsd.h +++ b/src/backend/port/dynloader/netbsd.h @@ -1,7 +1,7 @@ /*------------------------------------------------------------------------- * - * port_protos.h - * port-specific prototypes for NetBSD 1.0 + * netbsd.h + * port-specific prototypes for NetBSD * * * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group @@ -21,7 +21,6 @@ #include "utils/dynamic_loader.h" -/* dynloader.c */ /* * Dynamic Loader on NetBSD 1.0. * @@ -34,7 +33,21 @@ * begin with an underscore is fairly tricky, and some versions of * NetBSD (like 1.0, and 1.0A pre June 1995) have no dlerror.) */ -#define pg_dlopen(f) BSD44_derived_dlopen((f), RTLD_LAZY | RTLD_GLOBAL) + +/* + * In some older systems, the RTLD_NOW flag isn't defined and the mode + * argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted + * if available, but it doesn't exist everywhere. + * If it doesn't exist, set it to 0 so it has no effect. + */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif + +#define pg_dlopen(f) BSD44_derived_dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym BSD44_derived_dlsym #define pg_dlclose BSD44_derived_dlclose #define pg_dlerror BSD44_derived_dlerror diff --git a/src/backend/port/dynloader/openbsd.h b/src/backend/port/dynloader/openbsd.h index dcb94bd9ad..534e4c59f8 100644 --- a/src/backend/port/dynloader/openbsd.h +++ b/src/backend/port/dynloader/openbsd.h @@ -1,6 +1,7 @@ /*------------------------------------------------------------------------- * - * Dynamic loader for OpenBSD + * openbsd.h + * port-specific prototypes for OpenBSD * * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California @@ -19,7 +20,6 @@ #include "utils/dynamic_loader.h" -/* dynloader.c */ /* * Dynamic Loader on NetBSD 1.0. * @@ -32,7 +32,21 @@ * begin with an underscore is fairly tricky, and some versions of * NetBSD (like 1.0, and 1.0A pre June 1995) have no dlerror.) */ -#define pg_dlopen(f) BSD44_derived_dlopen((f), RTLD_LAZY) + +/* + * In some older systems, the RTLD_NOW flag isn't defined and the mode + * argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted + * if available, but it doesn't exist everywhere. + * If it doesn't exist, set it to 0 so it has no effect. + */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif + +#define pg_dlopen(f) BSD44_derived_dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym BSD44_derived_dlsym #define pg_dlclose BSD44_derived_dlclose #define pg_dlerror BSD44_derived_dlerror diff --git a/src/backend/port/dynloader/osf.h b/src/backend/port/dynloader/osf.h index b0c7f11c3e..dcec4a5e09 100644 --- a/src/backend/port/dynloader/osf.h +++ b/src/backend/port/dynloader/osf.h @@ -1,6 +1,6 @@ /*------------------------------------------------------------------------- * - * alpha.h + * osf.h * prototypes for OSF/1-specific routines * * @@ -18,23 +18,28 @@ #include #include "utils/dynamic_loader.h" -/* dynloader.c */ - /* * Dynamic Loader on Alpha OSF/1.x * * this dynamic loader uses the system dynamic loading interface for shared * libraries (ie. dlopen/dlsym/dlclose). The user must specify a shared * library as the file to be dynamically loaded. - * */ -/* RTLD_GLOBAL is not available in <5.x */ +/* + * In some older systems, the RTLD_NOW flag isn't defined and the mode + * argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted + * if available, but it doesn't exist everywhere. + * If it doesn't exist, set it to 0 so it has no effect. + */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif #ifndef RTLD_GLOBAL #define RTLD_GLOBAL 0 #endif -#define pg_dlopen(f) dlopen((f), RTLD_LAZY | RTLD_GLOBAL) +#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym(h, f) ((PGFunction) dlsym(h, f)) #define pg_dlclose(h) dlclose(h) #define pg_dlerror() dlerror() diff --git a/src/backend/port/dynloader/sco.h b/src/backend/port/dynloader/sco.h index aa88d74eaa..8025a44fc2 100644 --- a/src/backend/port/dynloader/sco.h +++ b/src/backend/port/dynloader/sco.h @@ -1,6 +1,6 @@ /*------------------------------------------------------------------------- * - * port_protos.h + * sco.h * port-specific prototypes for SCO 3.2v5.2 * * @@ -17,20 +17,30 @@ #include #include "utils/dynamic_loader.h" -/* dynloader.c */ /* * Dynamic Loader on SCO 3.2v5.0.2 * * this dynamic loader uses the system dynamic loading interface for shared * libraries (ie. dlopen/dlsym/dlclose). The user must specify a shared * library as the file to be dynamically loaded. - * */ -#define pg_dlopen(f) dlopen((f), RTLD_LAZY | RTLD_GLOBAL) + +/* + * In some older systems, the RTLD_NOW flag isn't defined and the mode + * argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted + * if available, but it doesn't exist everywhere. + * If it doesn't exist, set it to 0 so it has no effect. + */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif + +#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym dlsym #define pg_dlclose dlclose #define pg_dlerror dlerror -/* port.c */ - #endif /* PORT_PROTOS_H */ diff --git a/src/backend/port/dynloader/solaris.h b/src/backend/port/dynloader/solaris.h index 94c9d79f8d..77b8482947 100644 --- a/src/backend/port/dynloader/solaris.h +++ b/src/backend/port/dynloader/solaris.h @@ -1,14 +1,38 @@ -/* $Header$ */ - -#ifndef DYNLOADER_SOLARIS_H -#define DYNLOADER_SOLARIS_H +/*------------------------------------------------------------------------- + * + * solaris.h + * port-specific prototypes for Solaris + * + * + * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * $Id$ + * + *------------------------------------------------------------------------- + */ +#ifndef PORT_PROTOS_H +#define PORT_PROTOS_H #include #include "utils/dynamic_loader.h" -#define pg_dlopen(f) dlopen((f), RTLD_LAZY | RTLD_GLOBAL) +/* + * In some older systems, the RTLD_NOW flag isn't defined and the mode + * argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted + * if available, but it doesn't exist everywhere. + * If it doesn't exist, set it to 0 so it has no effect. + */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif + +#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym dlsym #define pg_dlclose dlclose #define pg_dlerror dlerror -#endif /* DYNLOADER_SOLARIS_H */ +#endif /* PORT_PROTOS_H */ diff --git a/src/backend/port/dynloader/sunos4.h b/src/backend/port/dynloader/sunos4.h index a1ed67ddcf..ad1727b454 100644 --- a/src/backend/port/dynloader/sunos4.h +++ b/src/backend/port/dynloader/sunos4.h @@ -1,6 +1,6 @@ /*------------------------------------------------------------------------- * - * port_protos.h + * sunos4.h * port-specific prototypes for SunOS 4 * * @@ -17,16 +17,28 @@ #include #include "utils/dynamic_loader.h" -/* dynloader.c */ /* * Dynamic Loader on SunOS 4. * * this dynamic loader uses the system dynamic loading interface for shared * libraries (ie. dlopen/dlsym/dlclose). The user must specify a shared * library as the file to be dynamically loaded. - * */ -#define pg_dlopen(f) dlopen((f),1) + +/* + * In some older systems, the RTLD_NOW flag isn't defined and the mode + * argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted + * if available, but it doesn't exist everywhere. + * If it doesn't exist, set it to 0 so it has no effect. + */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif + +#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym dlsym #define pg_dlclose dlclose #define pg_dlerror dlerror diff --git a/src/backend/port/dynloader/svr4.h b/src/backend/port/dynloader/svr4.h index 1ce24f57b3..5df6fc1a5c 100644 --- a/src/backend/port/dynloader/svr4.h +++ b/src/backend/port/dynloader/svr4.h @@ -1,6 +1,6 @@ /*------------------------------------------------------------------------- * - * dynloader.h + * svr4.h * port-specific prototypes for Intel x86/Intel SVR4 * * @@ -11,24 +11,36 @@ * *------------------------------------------------------------------------- */ -#ifndef DYNLOADER_H -#define DYNLOADER_H +#ifndef PORT_PROTOS_H +#define PORT_PROTOS_H #include #include "utils/dynamic_loader.h" -/* dynloader.h */ /* * Dynamic Loader on Intel x86/Intel SVR4. * * this dynamic loader uses the system dynamic loading interface for shared * libraries (ie. dlopen/dlsym/dlclose). The user must specify a shared * library as the file to be dynamically loaded. - * */ -#define pg_dlopen(f) dlopen((f), RTLD_LAZY | RTLD_GLOBAL) + +/* + * In some older systems, the RTLD_NOW flag isn't defined and the mode + * argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted + * if available, but it doesn't exist everywhere. + * If it doesn't exist, set it to 0 so it has no effect. + */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif + +#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym dlsym #define pg_dlclose dlclose #define pg_dlerror dlerror -#endif /* DYNLOADER_H */ +#endif /* PORT_PROTOS_H */ diff --git a/src/backend/port/dynloader/univel.h b/src/backend/port/dynloader/univel.h index c8a652f733..aef381712d 100644 --- a/src/backend/port/dynloader/univel.h +++ b/src/backend/port/dynloader/univel.h @@ -17,16 +17,28 @@ #include #include "utils/dynamic_loader.h" - /* dynloader.c */ /* * Dynamic Loader on Intel x86/Intel SVR4. * * this dynamic loader uses the system dynamic loading interface for shared * libraries (ie. dlopen/dlsym/dlclose). The user must specify a shared * library as the file to be dynamically loaded. - * - */ -#define pg_dlopen(f) dlopen((f), RTLD_LAZY | RTLD_GLOBAL) + */ + +/* + * In some older systems, the RTLD_NOW flag isn't defined and the mode + * argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted + * if available, but it doesn't exist everywhere. + * If it doesn't exist, set it to 0 so it has no effect. + */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif + +#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym dlsym #define pg_dlclose dlclose #define pg_dlerror dlerror diff --git a/src/backend/port/dynloader/unixware.h b/src/backend/port/dynloader/unixware.h index 691273fdbd..2edea13cf8 100644 --- a/src/backend/port/dynloader/unixware.h +++ b/src/backend/port/dynloader/unixware.h @@ -17,16 +17,28 @@ #include #include "utils/dynamic_loader.h" - /* dynloader.c */ /* * Dynamic Loader on Intel x86/Intel SVR4. * * this dynamic loader uses the system dynamic loading interface for shared * libraries (ie. dlopen/dlsym/dlclose). The user must specify a shared * library as the file to be dynamically loaded. - * - */ -#define pg_dlopen(f) dlopen((f), RTLD_LAZY | RTLD_GLOBAL) + */ + +/* + * In some older systems, the RTLD_NOW flag isn't defined and the mode + * argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted + * if available, but it doesn't exist everywhere. + * If it doesn't exist, set it to 0 so it has no effect. + */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif + +#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym dlsym #define pg_dlclose dlclose #define pg_dlerror dlerror diff --git a/src/backend/port/dynloader/win.h b/src/backend/port/dynloader/win.h index 01ee8761c7..4f76d20f0d 100644 --- a/src/backend/port/dynloader/win.h +++ b/src/backend/port/dynloader/win.h @@ -17,16 +17,28 @@ #include #include "utils/dynamic_loader.h" - /* dynloader.c */ /* * Dynamic Loader on Intel x86/Windows NT * * this dynamic loader uses the system dynamic loading interface for shared * libraries (ie. dlopen/dlsym/dlclose). The user must specify a shared * library as the file to be dynamically loaded. - * - */ -#define pg_dlopen(f) dlopen((f), RTLD_LAZY | RTLD_GLOBAL) + */ + +/* + * In some older systems, the RTLD_NOW flag isn't defined and the mode + * argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted + * if available, but it doesn't exist everywhere. + * If it doesn't exist, set it to 0 so it has no effect. + */ +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif + +#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) #define pg_dlsym dlsym #define pg_dlclose dlclose #define pg_dlerror dlerror -- 2.39.5