Don't reference the Linux-specific variables preloader_start and preloader_end in the shared code.
Signed-off-by: Ken Thomases ken@codeweavers.com --- v2: Avoid a platform #ifdef in the shared code Set up infrastructure for eventual implementation of overlap check on Mac
loader/preloader.c | 19 ++++++++++++------- loader/preloader.h | 1 + loader/preloader_mac.c | 5 +++++ 3 files changed, 18 insertions(+), 7 deletions(-)
diff --git a/loader/preloader.c b/loader/preloader.c index 3b1f5ad..9f2fbc3 100644 --- a/loader/preloader.c +++ b/loader/preloader.c @@ -1049,6 +1049,17 @@ static int is_in_preload_range( const struct wld_auxv *av, int type ) return 0; }
+int preloader_overlaps_range( const void *start, const void *end ) +{ + if ((char *)end > preloader_start && (char *)start <= preloader_end) + { + wld_printf( "WINEPRELOADRESERVE range %p-%p overlaps preloader %p-%p\n", + start, end, preloader_start, preloader_end ); + return 1; + } + return 0; +} + /* set the process name if supported */ static void set_process_name( int argc, char *argv[] ) { @@ -1316,14 +1327,8 @@ void preload_reserve( const char *str, struct wine_preload_info *preload_info, s else if (result) goto error; /* single value '0' is allowed */
/* sanity checks */ - if (end <= start) start = end = NULL; - else if ((char *)end > preloader_start && - (char *)start <= preloader_end) - { - wld_printf( "WINEPRELOADRESERVE range %p-%p overlaps preloader %p-%p\n", - start, end, preloader_start, preloader_end ); + if (end <= start || preloader_overlaps_range(start, end)) start = end = NULL; - }
/* check for overlap with low memory areas */ for (i = 0; preload_info[i].size; i++) diff --git a/loader/preloader.h b/loader/preloader.h index 2c2262e..b944a09 100644 --- a/loader/preloader.h +++ b/loader/preloader.h @@ -51,6 +51,7 @@ extern __attribute__((format(printf,1,2))) void wld_printf(const char *fmt, ... extern __attribute__((noreturn,format(printf,1,2))) void fatal_error(const char *fmt, ... );
extern void preload_reserve( const char *str, struct wine_preload_info *preload_info, size_t page_mask ); +extern int preloader_overlaps_range( const void *start, const void *end );
/* remove a range from the preload list */ static inline void remove_preload_range( int i, struct wine_preload_info *preload_info ) diff --git a/loader/preloader_mac.c b/loader/preloader_mac.c index d008270..5e9f9fc 100644 --- a/loader/preloader_mac.c +++ b/loader/preloader_mac.c @@ -374,6 +374,11 @@ static int map_region( struct wine_preload_info *info ) return 0; }
+int preloader_overlaps_range( const void *start, const void *end ) +{ + return 0; +} + static inline void get_dyld_func( const char *name, void **func ) { _dyld_func_lookup( name, func );