Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
b87256cd
Commit
b87256cd
authored
Apr 06, 2020
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
libwine: Make the dlopen() wrapper functions obsolete.
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
0f53fca3
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
143 additions
and
153 deletions
+143
-153
library.h
include/wine/library.h
+0
-3
stubs.c
libs/port/stubs.c
+0
-22
loader.c
libs/wine/loader.c
+140
-125
wine.map
libs/wine/wine.map
+3
-3
No files found.
include/wine/library.h
View file @
b87256cd
...
...
@@ -55,9 +55,6 @@ extern void wine_exec_wine_binary( const char *name, char **argv, const char *en
typedef
void
(
*
load_dll_callback_t
)(
void
*
,
const
char
*
);
extern
void
*
wine_dlopen
(
const
char
*
filename
,
int
flag
,
char
*
error
,
size_t
errorsize
);
extern
void
*
wine_dlsym
(
void
*
handle
,
const
char
*
symbol
,
char
*
error
,
size_t
errorsize
);
extern
int
wine_dlclose
(
void
*
handle
,
char
*
error
,
size_t
errorsize
);
extern
void
wine_dll_set_callback
(
load_dll_callback_t
load
);
extern
const
char
*
wine_dll_enum_load_path
(
unsigned
int
index
);
...
...
libs/port/stubs.c
View file @
b87256cd
...
...
@@ -56,26 +56,4 @@ const char *wine_dll_enum_load_path( unsigned int index )
return
NULL
;
}
void
*
wine_dlopen
(
const
char
*
filename
,
int
flag
,
char
*
error
,
size_t
errorsize
)
{
if
(
error
)
{
static
const
char
msg
[]
=
"no dlopen support on Windows"
;
size_t
len
=
min
(
errorsize
,
sizeof
(
msg
)
);
memcpy
(
error
,
msg
,
len
);
error
[
len
-
1
]
=
0
;
}
return
NULL
;
}
void
*
wine_dlsym
(
void
*
handle
,
const
char
*
symbol
,
char
*
error
,
size_t
errorsize
)
{
return
NULL
;
}
int
wine_dlclose
(
void
*
handle
,
char
*
error
,
size_t
errorsize
)
{
return
0
;
}
#endif
/* _WIN32 */
libs/wine/loader.c
View file @
b87256cd
...
...
@@ -508,6 +508,128 @@ const char *wine_dll_enum_load_path( unsigned int index )
#ifdef __ASM_OBSOLETE
/*
* These functions provide wrappers around dlopen() and associated
* functions. They work around a bug in glibc 2.1.x where calling
* a dl*() function after a previous dl*() function has failed
* without a dlerror() call between the two will cause a crash.
* They all take a pointer to a buffer that
* will receive the error description (from dlerror()). This
* parameter may be NULL if the error description is not required.
*/
#ifndef RTLD_FIRST
#define RTLD_FIRST 0
#endif
/***********************************************************************
* wine_dlopen
*/
void
*
wine_dlopen_obsolete
(
const
char
*
filename
,
int
flag
,
char
*
error
,
size_t
errorsize
)
{
void
*
ret
;
const
char
*
s
;
#ifdef __APPLE__
/* the Mac OS loader pretends to be able to load PE files, so avoid them here */
unsigned
char
magic
[
2
];
int
fd
=
open
(
filename
,
O_RDONLY
);
if
(
fd
!=
-
1
)
{
if
(
pread
(
fd
,
magic
,
2
,
0
)
==
2
&&
magic
[
0
]
==
'M'
&&
magic
[
1
]
==
'Z'
)
{
if
(
error
&&
errorsize
)
{
static
const
char
msg
[]
=
"MZ format"
;
size_t
len
=
min
(
errorsize
,
sizeof
(
msg
)
);
memcpy
(
error
,
msg
,
len
);
error
[
len
-
1
]
=
0
;
}
close
(
fd
);
return
NULL
;
}
close
(
fd
);
}
#endif
dlerror
();
dlerror
();
#ifdef __sun
if
(
strchr
(
filename
,
':'
))
{
char
path
[
PATH_MAX
];
/* Solaris' brain damaged dlopen() treats ':' as a path separator */
realpath
(
filename
,
path
);
ret
=
dlopen
(
path
,
flag
|
RTLD_FIRST
);
}
else
#endif
ret
=
dlopen
(
filename
,
flag
|
RTLD_FIRST
);
s
=
dlerror
();
if
(
error
&&
errorsize
)
{
if
(
s
)
{
size_t
len
=
strlen
(
s
);
if
(
len
>=
errorsize
)
len
=
errorsize
-
1
;
memcpy
(
error
,
s
,
len
);
error
[
len
]
=
0
;
}
else
error
[
0
]
=
0
;
}
dlerror
();
return
ret
;
}
/***********************************************************************
* wine_dlsym
*/
void
*
wine_dlsym_obsolete
(
void
*
handle
,
const
char
*
symbol
,
char
*
error
,
size_t
errorsize
)
{
void
*
ret
;
const
char
*
s
;
dlerror
();
dlerror
();
ret
=
dlsym
(
handle
,
symbol
);
s
=
dlerror
();
if
(
error
&&
errorsize
)
{
if
(
s
)
{
size_t
len
=
strlen
(
s
);
if
(
len
>=
errorsize
)
len
=
errorsize
-
1
;
memcpy
(
error
,
s
,
len
);
error
[
len
]
=
0
;
}
else
error
[
0
]
=
0
;
}
dlerror
();
return
ret
;
}
/***********************************************************************
* wine_dlclose
*/
int
wine_dlclose_obsolete
(
void
*
handle
,
char
*
error
,
size_t
errorsize
)
{
int
ret
;
const
char
*
s
;
dlerror
();
dlerror
();
ret
=
dlclose
(
handle
);
s
=
dlerror
();
if
(
error
&&
errorsize
)
{
if
(
s
)
{
size_t
len
=
strlen
(
s
);
if
(
len
>=
errorsize
)
len
=
errorsize
-
1
;
memcpy
(
error
,
s
,
len
);
error
[
len
]
=
0
;
}
else
error
[
0
]
=
0
;
}
dlerror
();
return
ret
;
}
/* check if the library is the correct architecture */
/* only returns false for a valid library of the wrong arch */
static
int
check_library_arch
(
int
fd
)
...
...
@@ -570,7 +692,7 @@ static void *dlopen_dll( const char *name, char *error, int errorsize,
*
exists
=
0
;
for
(
path
=
first_dll_path
(
name
,
0
,
&
context
);
path
;
path
=
next_dll_path
(
&
context
))
{
if
(
!
test_only
&&
(
ret
=
wine_dlopen
(
path
,
RTLD_NOW
,
error
,
errorsize
)))
break
;
if
(
!
test_only
&&
(
ret
=
wine_dlopen
_obsolete
(
path
,
RTLD_NOW
,
error
,
errorsize
)))
break
;
if
((
*
exists
=
file_exists
(
path
)))
break
;
/* exists but cannot be loaded, return the error */
}
free_dll_path
(
&
context
);
...
...
@@ -616,7 +738,7 @@ void *wine_dll_load_obsolete( const char *filename, char *error, int errorsize,
void
wine_dll_unload_obsolete
(
void
*
handle
)
{
if
(
handle
!=
(
void
*
)
1
)
wine_dlclose
(
handle
,
NULL
,
0
);
wine_dlclose
_obsolete
(
handle
,
NULL
,
0
);
}
...
...
@@ -664,6 +786,9 @@ int wine_dll_get_owner_obsolete( const char *name, char *buffer, int size, int *
return
ret
;
}
__ASM_OBSOLETE
(
wine_dlopen
);
__ASM_OBSOLETE
(
wine_dlsym
);
__ASM_OBSOLETE
(
wine_dlclose
);
__ASM_OBSOLETE
(
wine_dll_get_owner
);
__ASM_OBSOLETE
(
wine_dll_load
);
__ASM_OBSOLETE
(
wine_dll_load_main_exe
);
...
...
@@ -983,7 +1108,7 @@ void wine_init( int argc, char *argv[], char *error, int error_size )
for
(
path
=
first_dll_path
(
"ntdll.dll"
,
0
,
&
context
);
path
;
path
=
next_dll_path
(
&
context
))
{
if
((
ntdll
=
wine_dlopen
(
path
,
RTLD_NOW
,
error
,
error_size
)))
if
((
ntdll
=
dlopen
(
path
,
RTLD_NOW
)))
{
/* if we didn't use the default dll dir, remove it from the search path */
if
(
default_dlldir
[
0
]
&&
context
.
index
<
nb_dll_paths
+
2
)
nb_dll_paths
--
;
...
...
@@ -992,133 +1117,23 @@ void wine_init( int argc, char *argv[], char *error, int error_size )
}
free_dll_path
(
&
context
);
if
(
!
ntdll
)
return
;
if
(
!
(
init_func
=
wine_dlsym
(
ntdll
,
"__wine_process_init"
,
error
,
error_size
)))
return
;
#ifdef __APPLE__
apple_main_thread
(
init_func
);
#else
init_func
();
#endif
}
/*
* These functions provide wrappers around dlopen() and associated
* functions. They work around a bug in glibc 2.1.x where calling
* a dl*() function after a previous dl*() function has failed
* without a dlerror() call between the two will cause a crash.
* They all take a pointer to a buffer that
* will receive the error description (from dlerror()). This
* parameter may be NULL if the error description is not required.
*/
#ifndef RTLD_FIRST
#define RTLD_FIRST 0
#endif
/***********************************************************************
* wine_dlopen
*/
void
*
wine_dlopen
(
const
char
*
filename
,
int
flag
,
char
*
error
,
size_t
errorsize
)
{
void
*
ret
;
const
char
*
s
;
#ifdef __APPLE__
/* the Mac OS loader pretends to be able to load PE files, so avoid them here */
unsigned
char
magic
[
2
];
int
fd
=
open
(
filename
,
O_RDONLY
);
if
(
fd
!=
-
1
)
if
(
!
ntdll
||
!
(
init_func
=
dlsym
(
ntdll
,
"__wine_process_init"
)))
{
if
(
pread
(
fd
,
magic
,
2
,
0
)
==
2
&&
magic
[
0
]
==
'M'
&&
magic
[
1
]
==
'Z'
)
if
(
error
&&
error_size
)
{
if
(
error
&&
errorsize
)
const
char
*
s
=
dlerror
();
if
(
s
)
{
static
const
char
msg
[]
=
"MZ format"
;
size_t
len
=
min
(
errorsize
,
sizeof
(
msg
)
);
memcpy
(
error
,
msg
,
len
);
error
[
len
-
1
]
=
0
;
size_t
len
=
min
(
strlen
(
s
),
error_size
-
1
);
memcpy
(
error
,
s
,
len
);
error
[
len
]
=
0
;
}
close
(
fd
);
return
NULL
;
else
error
[
0
]
=
0
;
}
close
(
fd
);
}
#endif
dlerror
();
dlerror
();
#ifdef __sun
if
(
strchr
(
filename
,
':'
))
{
char
path
[
PATH_MAX
];
/* Solaris' brain damaged dlopen() treats ':' as a path separator */
realpath
(
filename
,
path
);
ret
=
dlopen
(
path
,
flag
|
RTLD_FIRST
);
}
else
#ifdef __APPLE__
apple_main_thread
(
init_func
);
#else
init_func
();
#endif
ret
=
dlopen
(
filename
,
flag
|
RTLD_FIRST
);
s
=
dlerror
();
if
(
error
&&
errorsize
)
{
if
(
s
)
{
size_t
len
=
strlen
(
s
);
if
(
len
>=
errorsize
)
len
=
errorsize
-
1
;
memcpy
(
error
,
s
,
len
);
error
[
len
]
=
0
;
}
else
error
[
0
]
=
0
;
}
dlerror
();
return
ret
;
}
/***********************************************************************
* wine_dlsym
*/
void
*
wine_dlsym
(
void
*
handle
,
const
char
*
symbol
,
char
*
error
,
size_t
errorsize
)
{
void
*
ret
;
const
char
*
s
;
dlerror
();
dlerror
();
ret
=
dlsym
(
handle
,
symbol
);
s
=
dlerror
();
if
(
error
&&
errorsize
)
{
if
(
s
)
{
size_t
len
=
strlen
(
s
);
if
(
len
>=
errorsize
)
len
=
errorsize
-
1
;
memcpy
(
error
,
s
,
len
);
error
[
len
]
=
0
;
}
else
error
[
0
]
=
0
;
}
dlerror
();
return
ret
;
}
/***********************************************************************
* wine_dlclose
*/
int
wine_dlclose
(
void
*
handle
,
char
*
error
,
size_t
errorsize
)
{
int
ret
;
const
char
*
s
;
dlerror
();
dlerror
();
ret
=
dlclose
(
handle
);
s
=
dlerror
();
if
(
error
&&
errorsize
)
{
if
(
s
)
{
size_t
len
=
strlen
(
s
);
if
(
len
>=
errorsize
)
len
=
errorsize
-
1
;
memcpy
(
error
,
s
,
len
);
error
[
len
]
=
0
;
}
else
error
[
0
]
=
0
;
}
dlerror
();
return
ret
;
}
libs/wine/wine.map
View file @
b87256cd
...
...
@@ -9,11 +9,8 @@ WINE_1.0
wine_anon_mmap;
wine_casemap_lower;
wine_casemap_upper;
wine_dlclose;
wine_dll_enum_load_path;
wine_dll_set_callback;
wine_dlopen;
wine_dlsym;
wine_exec_wine_binary;
wine_get_build_dir;
wine_get_build_id;
...
...
@@ -88,10 +85,13 @@ WINE_1.0
wine_dbg_sprintf;
wine_dbgstr_an;
wine_dbgstr_wn;
wine_dlclose;
wine_dll_get_owner;
wine_dll_load;
wine_dll_load_main_exe;
wine_dll_unload;
wine_dlopen;
wine_dlsym;
wine_fold_string;
wine_get_cs;
wine_get_ds;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment