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

Alexandre Julliard julliard at winehq.org
Thu Jun 18 15:33:36 CDT 2020


Module: wine
Branch: master
Commit: a0b7fb9bb2a6f446a0018a89bd8b50f756a0fe1c
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=a0b7fb9bb2a6f446a0018a89bd8b50f756a0fe1c

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jun 18 14:14:19 2020 +0200

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

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/thread.c            | 76 ------------------------------------------
 dlls/ntdll/unix/loader.c       | 40 ++++++++++++++++++++++
 dlls/ntdll/unix/unix_private.h |  3 +-
 dlls/ntdll/unix/virtual.c      |  1 +
 4 files changed, 43 insertions(+), 77 deletions(-)

diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index e60018fb47..7329aa177b 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -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.
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index 091951163d..4ae51cb2f4 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -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
  */
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index dbd8ce3152..9904ef7bfd 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -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;
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
index a32059f019..6166507871 100644
--- a/dlls/ntdll/unix/virtual.c
+++ b/dlls/ntdll/unix/virtual.c
@@ -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;
 }




More information about the wine-cvs mailing list