[PATCH 2/2] loader: Implement preloader for Mac OS.

Alexandre Julliard julliard at winehq.org
Thu Nov 29 05:05:42 CST 2018


Ken Thomases <ken at codeweavers.com> writes:

> @@ -108,21 +108,63 @@
>  
>  static struct wine_preload_info preload_info[] =
>  {
> +/* On macOS, we allocate the low 64k area in two steps because PAGEZERO
> + * might not always be available. Also, the top-down allocations area
> + * on x86_64 is moved because the address on Linux exceeds the maximum
> + * allowed user space limit. Please note that on Linux, it is better to
> + * allocate the low 64k as a single chunk to avoid SELinux warnings on
> + * systems with CONFIG_DEFAULT_MMAP_MIN_ADDR < CONFIG_LSM_MMAP_MIN_ADDR. */
> +#ifdef __APPLE__
> +#ifdef __i386__
> +    { (void *)0x00000000, 0x00001000 },  /* first page */
> +    { (void *)0x00001000, 0x0000f000 },  /* low 64k */
> +    { (void *)0x00010000, 0x00100000 },  /* DOS area */
> +    { (void *)0x00110000, 0x67ef0000 },  /* low memory area */
> +    { (void *)0x7f000000, 0x03000000 },  /* top-down allocations + shared heap + virtual heap */
> +#else  /* __i386__ */
> +    { (void *)0x000000010000, 0x00100000 },  /* DOS area */
> +    { (void *)0x000000110000, 0x67ef0000 },  /* low memory area */
> +    { (void *)0x00007ff00000, 0x000f0000 },  /* shared user data */
> +    { (void *)0x7fff40000000, 0x01ff0000 },  /* top-down allocations + virtual heap */
> +#endif /* __i386__ */
> +#else  /* __APPLE__ */
>  #ifdef __i386__
>      { (void *)0x00000000, 0x00010000 },  /* low 64k */
>      { (void *)0x00010000, 0x00100000 },  /* DOS area */
>      { (void *)0x00110000, 0x67ef0000 },  /* low memory area */
>      { (void *)0x7f000000, 0x03000000 },  /* top-down allocations + shared heap + virtual heap */
> -#else
> +#else  /* __i386__ */
>      { (void *)0x000000010000, 0x00100000 },  /* DOS area */
>      { (void *)0x000000110000, 0x67ef0000 },  /* low memory area */
>      { (void *)0x00007ff00000, 0x000f0000 },  /* shared user data */
>      { (void *)0x7ffffe000000, 0x01ff0000 },  /* top-down allocations + virtual heap */
> -#endif
> +#endif /* __i386__ */
> +#endif /* __APPLE__ */
>      { 0, 0 },                            /* PE exe range set with WINEPRELOADRESERVE */
>      { 0, 0 }                             /* end of list */
>  };
>  
> +#ifdef __APPLE__
> +
> +#ifndef LC_MAIN
> +#define LC_MAIN 0x80000028
> +struct entry_point_command
> +{
> +    uint32_t cmd;
> +    uint32_t cmdsize;
> +    uint64_t entryoff;
> +    uint64_t stacksize;
> +};
> +#endif
> +
> +#else  /* __APPLE__ */

With all these #ifdef __APPLE__ there is very little common code
left. It would be better to put the Mac implementation in a separate
file.

-- 
Alexandre Julliard
julliard at winehq.org



More information about the wine-devel mailing list