From 973138c06891b9ec36c0c6cd6ca593554bb69043 Mon Sep 17 00:00:00 2001 From: Gerald Pfeifer Date: Sun, 19 Apr 2020 10:43:44 +0200 Subject: [PATCH] ntdll: Fix call_constructor build on FreeBSD. Signed-off-by: Gerald Pfeifer Signed-off-by: Alexandre Julliard --- dlls/ntdll/loader.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index c713a5d0a6a..b0d5cf46a54 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -1324,17 +1324,21 @@ static void call_constructors( WINE_MODREF *wm ) void (*init_func)(int, char **, char **) = NULL; void (**init_array)(int, char **, char **) = NULL; ULONG_PTR i, init_arraysz = 0; +#ifdef _WIN64 + const Elf64_Dyn *dyn; +#else + const Elf32_Dyn *dyn; +#endif if (dlinfo( wm->so_handle, RTLD_DI_LINKMAP, &map ) == -1) return; - while (map->l_ld->d_tag) + for (dyn = map->l_ld; dyn->d_tag; dyn++) { - switch (map->l_ld->d_tag) + switch (dyn->d_tag) { - case 0x60009990: init_array = (void *)((char *)map->l_addr + map->l_ld->d_un.d_val); break; - case 0x60009991: init_arraysz = map->l_ld->d_un.d_val; break; - case 0x60009992: init_func = (void *)((char *)map->l_addr + map->l_ld->d_un.d_val); break; + case 0x60009990: init_array = (void *)((char *)map->l_addr + dyn->d_un.d_val); break; + case 0x60009991: init_arraysz = dyn->d_un.d_val; break; + case 0x60009992: init_func = (void *)((char *)map->l_addr + dyn->d_un.d_val); break; } - map->l_ld++; } TRACE( "%s: got init_func %p init_array %p %lu\n", debugstr_us( &wm->ldr.BaseDllName ),