ntdll: Move the image address initialization to the Unix library.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
feature/deterministic
Alexandre Julliard 2020-06-18 14:14:19 +02:00
parent 2e6a2cf9c6
commit a0b7fb9bb2
4 changed files with 43 additions and 77 deletions

View File

@ -25,15 +25,6 @@
#include <stdarg.h>
#include <limits.h>
#include <sys/types.h>
#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#endif
#ifdef HAVE_SYS_TIMES_H
#include <sys/times.h>
#endif
#ifdef HAVE_SYS_SYSCALL_H
#include <sys/syscall.h>
#endif
#define NONAMELESSUNION
#include "ntstatus.h"
@ -67,72 +58,6 @@ static RTL_CRITICAL_SECTION_DEBUG critsect_debug =
};
static RTL_CRITICAL_SECTION peb_lock = { &critsect_debug, -1, 0, 0, 0, 0 };
#ifdef __linux__
#ifdef HAVE_ELF_H
# include <elf.h>
#endif
#ifdef HAVE_LINK_H
# include <link.h>
#endif
#ifdef HAVE_SYS_AUXV_H
# include <sys/auxv.h>
#endif
#ifndef HAVE_GETAUXVAL
static unsigned long getauxval( unsigned long id )
{
extern char **__wine_main_environ;
char **ptr = __wine_main_environ;
ElfW(auxv_t) *auxv;
while (*ptr) ptr++;
while (!*ptr) ptr++;
for (auxv = (ElfW(auxv_t) *)ptr; auxv->a_type; auxv++)
if (auxv->a_type == id) return auxv->a_un.a_val;
return 0;
}
#endif
static ULONG_PTR get_image_addr(void)
{
ULONG_PTR size, num, phdr_addr = getauxval( AT_PHDR );
ElfW(Phdr) *phdr;
if (!phdr_addr) return 0;
phdr = (ElfW(Phdr) *)phdr_addr;
size = getauxval( AT_PHENT );
num = getauxval( AT_PHNUM );
while (num--)
{
if (phdr->p_type == PT_PHDR) return phdr_addr - phdr->p_offset;
phdr = (ElfW(Phdr) *)((char *)phdr + size);
}
return 0;
}
#elif defined(__APPLE__)
#include <mach/mach.h>
#include <mach/mach_error.h>
static ULONG_PTR get_image_addr(void)
{
ULONG_PTR ret = 0;
#ifdef TASK_DYLD_INFO
struct task_dyld_info dyld_info;
mach_msg_type_number_t size = TASK_DYLD_INFO_COUNT;
if (task_info(mach_task_self(), TASK_DYLD_INFO, (task_info_t)&dyld_info, &size) == KERN_SUCCESS)
ret = dyld_info.all_image_info_addr;
#endif
return ret;
}
#else
static ULONG_PTR get_image_addr(void)
{
return 0;
}
#endif
/***********************************************************************
* __wine_dbg_get_channel_flags (NTDLL.@)
@ -204,7 +129,6 @@ TEB *thread_init( SIZE_T *info_size, BOOL *suspend )
InitializeListHead( &ldr.InLoadOrderModuleList );
InitializeListHead( &ldr.InMemoryOrderModuleList );
InitializeListHead( &ldr.InInitializationOrderModuleList );
*(ULONG_PTR *)peb->Reserved = get_image_addr();
/*
* Starting with Vista, the first user to log on has session id 1.

View File

@ -33,6 +33,15 @@
#ifdef HAVE_PWD_H
# include <pwd.h>
#endif
#ifdef HAVE_ELF_H
# include <elf.h>
#endif
#ifdef HAVE_LINK_H
# include <link.h>
#endif
#ifdef HAVE_SYS_AUXV_H
# include <sys/auxv.h>
#endif
#ifdef HAVE_SYS_MMAN_H
# include <sys/mman.h>
#endif
@ -53,6 +62,8 @@
# undef LoadResource
# undef GetCurrentThread
# include <pthread.h>
# include <mach/mach.h>
# include <mach/mach_error.h>
# include <mach-o/getsect.h>
# include <crt_externs.h>
# include <spawn.h>
@ -829,6 +840,35 @@ static HMODULE load_ntdll(void)
}
/***********************************************************************
* get_image_address
*/
ULONG_PTR get_image_address(void)
{
#ifdef HAVE_GETAUXVAL
ULONG_PTR size, num, phdr_addr = getauxval( AT_PHDR );
ElfW(Phdr) *phdr;
if (!phdr_addr) return 0;
phdr = (ElfW(Phdr) *)phdr_addr;
size = getauxval( AT_PHENT );
num = getauxval( AT_PHNUM );
while (num--)
{
if (phdr->p_type == PT_PHDR) return phdr_addr - phdr->p_offset;
phdr = (ElfW(Phdr) *)((char *)phdr + size);
}
#elif defined(__APPLE__) && defined(TASK_DYLD_INFO)
struct task_dyld_info dyld_info;
mach_msg_type_number_t size = TASK_DYLD_INFO_COUNT;
if (task_info(mach_task_self(), TASK_DYLD_INFO, (task_info_t)&dyld_info, &size) == KERN_SUCCESS)
return dyld_info.all_image_info_addr;
#endif
return 0;
}
/***********************************************************************
* unix_funcs
*/

View File

@ -142,11 +142,12 @@ extern int ntdll_wcstoumbs( const WCHAR *src, DWORD srclen, char *dst, DWORD dst
extern char **build_envp( const WCHAR *envW ) DECLSPEC_HIDDEN;
extern NTSTATUS exec_wineloader( char **argv, int socketfd, int is_child_64bit,
ULONGLONG res_start, ULONGLONG res_end ) DECLSPEC_HIDDEN;
extern void start_server( BOOL debug ) DECLSPEC_HIDDEN;
extern ULONG_PTR get_image_address(void) DECLSPEC_HIDDEN;
extern unsigned int server_call_unlocked( void *req_ptr ) DECLSPEC_HIDDEN;
extern void server_enter_uninterrupted_section( RTL_CRITICAL_SECTION *cs, sigset_t *sigset ) DECLSPEC_HIDDEN;
extern void server_leave_uninterrupted_section( RTL_CRITICAL_SECTION *cs, sigset_t *sigset ) DECLSPEC_HIDDEN;
extern void start_server( BOOL debug ) DECLSPEC_HIDDEN;
extern unsigned int server_select( const select_op_t *select_op, data_size_t size, UINT flags,
timeout_t abs_timeout, CONTEXT *context, RTL_CRITICAL_SECTION *cs,
user_apc_t *user_apc ) DECLSPEC_HIDDEN;

View File

@ -2587,6 +2587,7 @@ TEB *virtual_alloc_first_teb(void)
NtAllocateVirtualMemory( NtCurrentProcess(), (void **)&teb, 0, &teb_size, MEM_COMMIT, PAGE_READWRITE );
NtAllocateVirtualMemory( NtCurrentProcess(), (void **)&peb, 0, &peb_size, MEM_COMMIT, PAGE_READWRITE );
init_teb( teb, peb );
*(ULONG_PTR *)peb->Reserved = get_image_address();
use_locks = TRUE;
return teb;
}