Mach-O Support in WineLib Loader (2) dlopen
Pierre d'Herbemont
stegefin at free.fr
Tue Jul 22 06:50:21 CDT 2003
On mardi, juil 22, 2003, at 04:54 Europe/Paris, Alexandre Julliard
wrote:
> "Pierre d'Herbemont" <stegefin at free.fr> writes:
>
>> This patch provides Mach-O support in WineLib. As Mach-O doesn't have
>> init and fini section, it adds support for it in dlopen. A new file
>> mach-o.c is created. It contains functions which add support for init,
>> and fini section.
>
> Isn't there any way to have an init function? How does Mach-O support
> C++ constructors?
>
Sorry. There is a section for C++ constructor. It is supposed to be
reserved for the C++ compiler, but it works well with wine.
On the previous patch I would like your comment on the way to force
ntdll to be loaded as RTLD_GLOBAL. Ntdll can't be built currently as a
dynamic library (loadable at runtime). By the way I would like to now
why is ntdll linked to dlls? Maybe this patch could apply to linux and
others also, on a proper way.
Thanks a lot,
Pierre
(I submitted this patch to the wine-patch so here is the change log:)
ChangeLog:
- Force ntdll to be loaded with the RTLD_GLOBAL flag on Darwin
-------------- next part --------------
Index: libs/wine/loader.c
===================================================================
RCS file: /home/wine/wine/libs/wine/loader.c,v
retrieving revision 1.4
diff -u -r1.4 loader.c
--- libs/wine/loader.c 3 Jul 2003 18:23:10 -0000 1.4
+++ libs/wine/loader.c 22 Jul 2003 11:42:05 -0000
@@ -125,9 +125,14 @@
}
/* open a library for a given dll, searching in the dll path
- * 'name' must be the Windows dll name (e.g. "kernel32.dll") */
+ * 'name' must be the Windows dll name (e.g. "kernel32.dll")
+ * 'flags' value :
+ * - 0x0 dlopen RTLD_NOW
+ * - 0x1 test only
+ * - 0x2 dlopen RTLD_NOW | RTLD_GLOBAL (only on Darwin)
+ */
static void *dlopen_dll( const char *name, char *error, int errorsize,
- int test_only, int *exists )
+ int flags, int *exists )
{
int i, namelen = strlen(name);
char *buffer, *p;
@@ -149,7 +154,10 @@
int len = strlen(dll_paths[i]);
p = buffer + dll_path_maxlen - len;
memcpy( p, dll_paths[i], len );
- if (!test_only && (ret = wine_dlopen( p, RTLD_NOW, error, errorsize ))) break;
+ if (!flags && (ret = wine_dlopen( p, RTLD_NOW, error, errorsize ))) break;
+#ifdef __APPLE__
+ if ((flags == 0x2) && (ret = wine_dlopen( p, RTLD_NOW | RTLD_GLOBAL, error, errorsize ))) break;
+#endif
if ((*exists = file_exists( p ))) break; /* exists but cannot be loaded, return the error */
}
free( buffer );
@@ -422,7 +430,7 @@
void *ntdll;
void (*init_func)(int, char **);
- if (!(ntdll = dlopen_dll( "ntdll.dll", error, error_size, 0, &file_exists ))) return;
+ if (!(ntdll = dlopen_dll( "ntdll.dll", error, error_size, 0x2, &file_exists ))) return;
if (!(init_func = wine_dlsym( ntdll, "__wine_process_init", error, error_size ))) return;
init_func( argc, argv );
}
More information about the wine-devel
mailing list