Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
June 2018
- 68 participants
- 1149 messages
[PATCH 1/2] d3dx9/tests: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
This is the trivial in-place stuff.
The generated object files with or without this patch are identical.
dlls/d3dx9_36/tests/core.c | 8 ++++----
dlls/d3dx9_36/tests/effect.c | 2 +-
dlls/d3dx9_36/tests/shader.c | 22 +++++++++++-----------
dlls/d3dx9_36/tests/surface.c | 2 +-
4 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/dlls/d3dx9_36/tests/core.c b/dlls/d3dx9_36/tests/core.c
index 90b678fdf7..75d33c1e0d 100644
--- a/dlls/d3dx9_36/tests/core.c
+++ b/dlls/d3dx9_36/tests/core.c
@@ -552,7 +552,7 @@ static void test_ID3DXFont(IDirect3DDevice9 *device)
check_release((IUnknown*)font, 0);
} else skip("Failed to create a ID3DXFont object\n");
- for(i = 0; i < sizeof(texture_tests) / sizeof(texture_tests[0]); i++) {
+ for(i = 0; i < ARRAY_SIZE(texture_tests); i++) {
HDC hdc;
DWORD ret;
HRESULT hr;
@@ -617,7 +617,7 @@ static void test_D3DXCreateRenderToSurface(IDirect3DDevice9 *device)
hr = D3DXCreateRenderToSurface(device, 256, 256, D3DFMT_A8R8G8B8, FALSE, D3DFMT_UNKNOWN, NULL /* out */);
ok(hr == D3DERR_INVALIDCALL, "D3DXCreateRenderToSurface returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
- for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
{
hr = D3DXCreateRenderToSurface(device, tests[i].Width, tests[i].Height, tests[i].Format, tests[i].DepthStencil,
tests[i].DepthStencilFormat, &render);
@@ -1024,7 +1024,7 @@ static void test_ID3DXRenderToSurface(IDirect3DDevice9 *device)
check_release((IUnknown *)render, 0);
- for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
{
check_ID3DXRenderToSurface(device, tests[i].Width, tests[i].Height, tests[i].Format, tests[i].DepthStencil, tests[i].DepthStencilFormat, TRUE);
check_ID3DXRenderToSurface(device, tests[i].Width, tests[i].Height, tests[i].Format, tests[i].DepthStencil, tests[i].DepthStencilFormat, FALSE);
@@ -1052,7 +1052,7 @@ static void test_D3DXCreateRenderToEnvMap(IDirect3DDevice9 *device)
{ { 256, 1, D3DFMT_X8R8G8B8, TRUE, D3DFMT_UNKNOWN }, { 256, 1, D3DFMT_X8R8G8B8, TRUE, D3DFMT_UNKNOWN } }
};
- for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
{
const D3DXRTE_DESC *parameters = &tests[i].parameters;
const D3DXRTE_DESC *expected = &tests[i].expected_values;
diff --git a/dlls/d3dx9_36/tests/effect.c b/dlls/d3dx9_36/tests/effect.c
index 4f26b63a13..d9ff11eaea 100644
--- a/dlls/d3dx9_36/tests/effect.c
+++ b/dlls/d3dx9_36/tests/effect.c
@@ -991,7 +991,7 @@ struct test_effect_parameter_value_result test_effect_parameter_value_result_spe
test_effect_parameter_value_blob_ ## x,\
sizeof(test_effect_parameter_value_blob_ ## x),\
test_effect_parameter_value_result_ ## x,\
- sizeof(test_effect_parameter_value_result_ ## x)/sizeof(*test_effect_parameter_value_result_ ## x),\
+ ARRAY_SIZE(test_effect_parameter_value_result_ ## x),\
}
static const struct
diff --git a/dlls/d3dx9_36/tests/shader.c b/dlls/d3dx9_36/tests/shader.c
index 2f01a46e42..c2b41cfdc7 100644
--- a/dlls/d3dx9_36/tests/shader.c
+++ b/dlls/d3dx9_36/tests/shader.c
@@ -649,17 +649,17 @@ static void test_constant_table(const char *test_name, const DWORD *ctable_fn,
static void test_constant_tables(void)
{
test_constant_table("test_basic", ctab_basic, ctab_basic_expected,
- sizeof(ctab_basic_expected)/sizeof(*ctab_basic_expected));
+ ARRAY_SIZE(ctab_basic_expected));
test_constant_table("test_matrices", ctab_matrices, ctab_matrices_expected,
- sizeof(ctab_matrices_expected)/sizeof(*ctab_matrices_expected));
+ ARRAY_SIZE(ctab_matrices_expected));
test_constant_table("test_matrices2", ctab_matrices2, ctab_matrices2_expected,
- sizeof(ctab_matrices2_expected)/sizeof(*ctab_matrices2_expected));
+ ARRAY_SIZE(ctab_matrices2_expected));
test_constant_table("test_arrays", ctab_arrays, ctab_arrays_expected,
- sizeof(ctab_arrays_expected)/sizeof(*ctab_arrays_expected));
+ ARRAY_SIZE(ctab_arrays_expected));
test_constant_table("test_default_values", ctab_with_default_values, ctab_with_default_values_expected,
- sizeof(ctab_with_default_values_expected)/sizeof(*ctab_with_default_values_expected));
+ ARRAY_SIZE(ctab_with_default_values_expected));
test_constant_table("test_samplers", ctab_samplers, ctab_samplers_expected,
- sizeof(ctab_samplers_expected)/sizeof(*ctab_samplers_expected));
+ ARRAY_SIZE(ctab_samplers_expected));
}
static void test_setting_basic_table(IDirect3DDevice9 *device)
@@ -1844,7 +1844,7 @@ static void test_get_shader_constant_variables(void)
ctab = ID3DXConstantTable_GetBufferPointer(ctable);
ok(ctab[0] == test_get_shader_constant_variables_blob[3], "ID3DXConstantTable_GetBufferPointer failed\n");
- for (i = 0; i < sizeof(test_get_shader_constant_variables_data) / sizeof(*test_get_shader_constant_variables_data); ++i)
+ for (i = 0; i < ARRAY_SIZE(test_get_shader_constant_variables_data); ++i)
{
const char *fullname = test_get_shader_constant_variables_data[i].fullname;
const D3DXCONSTANT_DESC *expected_desc = &test_get_shader_constant_variables_data[i].desc;
@@ -6025,7 +6025,7 @@ static UINT registerset_compare_all(IDirect3DDevice9 *device, BOOL is_vs, D3DXRE
D3DXREGISTER_SET regsets[] = {D3DXRS_BOOL, D3DXRS_INT4, D3DXRS_FLOAT4};
UINT err = 0, i;
- for (i = 0; i < sizeof(regsets) / sizeof(*regsets); i++)
+ for (i = 0; i < ARRAY_SIZE(regsets); i++)
{
if (regset == regsets[i])
err += registerset_compare(device, is_vs, regset, start, in_count, expected);
@@ -6137,7 +6137,7 @@ static void test_registerset(void)
return;
}
- for (k = 0; k < sizeof(registerset_data) / sizeof(*registerset_data); ++k)
+ for (k = 0; k < ARRAY_SIZE(registerset_data); ++k)
{
const char *tablename = registerset_data[k].name;
const char *name = registerset_data[k].var;
@@ -6442,7 +6442,7 @@ static void test_registerset_defaults(void)
return;
}
- for (k = 0; k < sizeof(registerset_defaults_data) / sizeof(*registerset_defaults_data); ++k)
+ for (k = 0; k < ARRAY_SIZE(registerset_defaults_data); ++k)
{
const char *tablename = registerset_defaults_data[k].name;
ID3DXConstantTable *ctable;
@@ -6616,7 +6616,7 @@ static void test_shader_semantics(void)
hr = D3DXGetShaderInputSemantics(vs_1_1, semantics, NULL);
ok(hr == D3D_OK, "Unexpected hr %#x.\n", hr);
- for (i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i)
+ for (i = 0; i < ARRAY_SIZE(tests); ++i)
{
const DWORD *shader = tests[i].shader;
diff --git a/dlls/d3dx9_36/tests/surface.c b/dlls/d3dx9_36/tests/surface.c
index 324e2af3eb..37c488b5ad 100644
--- a/dlls/d3dx9_36/tests/surface.c
+++ b/dlls/d3dx9_36/tests/surface.c
@@ -398,7 +398,7 @@ static void test_dds_header_handling(void)
return;
}
- for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
{
DWORD file_size = sizeof(dds->magic) + sizeof(dds->header) + tests[i].pixel_data_size;
assert(file_size <= sizeof(*dds));
--
2.14.4
June 4, 2018
[PATCH 5/5] msvcrt: Don't reimplement call_unwind_func().
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/msvcrt/except_i386.c | 26 +++++---------------------
1 file changed, 5 insertions(+), 21 deletions(-)
diff --git a/dlls/msvcrt/except_i386.c b/dlls/msvcrt/except_i386.c
index 42212c9..301c169 100644
--- a/dlls/msvcrt/except_i386.c
+++ b/dlls/msvcrt/except_i386.c
@@ -59,7 +59,7 @@ typedef struct __catchblock_info
UINT flags; /* flags (see below) */
const type_info *type_info; /* C++ type caught by this block */
int offset; /* stack offset to copy exception object to */
- void (*handler)(void);/* catch block handler code */
+ int (*handler)(void);/* catch block handler code */
} catchblock_info;
#define TYPE_FLAG_CONST 1
#define TYPE_FLAG_VOLATILE 2
@@ -79,7 +79,7 @@ typedef struct __tryblock_info
typedef struct __unwind_info
{
int prev; /* prev trylevel unwind handler, to run after this one */
- void (*handler)(void);/* unwind handler */
+ int (*handler)(void);/* unwind handler */
} unwind_info;
/* descriptor of all try blocks of a given function */
@@ -137,22 +137,6 @@ DWORD CDECL cxx_frame_handler( PEXCEPTION_RECORD rec, cxx_exception_frame* frame
const cxx_function_descr *descr,
EXCEPTION_REGISTRATION_RECORD* nested_frame, int nested_trylevel ) DECLSPEC_HIDDEN;
-/* call a function with a given ebp */
-static inline void *call_ebp_func( void *func, void *ebp )
-{
- void *ret;
- int dummy;
- __asm__ __volatile__ ("pushl %%ebx\n\t"
- "pushl %%ebp\n\t"
- "movl %4,%%ebp\n\t"
- "call *%%eax\n\t"
- "popl %%ebp\n\t"
- "popl %%ebx"
- : "=a" (ret), "=S" (dummy), "=D" (dummy)
- : "0" (func), "1" (ebp) : "ecx", "edx", "memory" );
- return ret;
-}
-
/* call a copy constructor */
extern void call_copy_ctor( void *func, void *this, void *src, int has_vbase );
@@ -326,7 +310,7 @@ static void copy_exception( void *object, cxx_exception_frame *frame,
/* unwind the local function up to a given trylevel */
static void cxx_local_unwind( cxx_exception_frame* frame, const cxx_function_descr *descr, int last_level)
{
- void (*handler)(void);
+ int (*handler)(void);
int trylevel = frame->trylevel;
while (trylevel != last_level)
@@ -341,7 +325,7 @@ static void cxx_local_unwind( cxx_exception_frame* frame, const cxx_function_des
{
TRACE( "calling unwind handler %p trylevel %d last %d ebp %p\n",
handler, trylevel, last_level, &frame->ebp );
- call_ebp_func( handler, &frame->ebp );
+ call_unwind_func( handler, &frame->ebp );
}
trylevel = descr->unwind_table[trylevel].prev;
}
@@ -478,7 +462,7 @@ static inline void call_catch_block( PEXCEPTION_RECORD rec, CONTEXT *context,
nested_frame.trylevel = nested_trylevel + 1;
__wine_push_frame( &nested_frame.frame );
- addr = call_ebp_func( catchblock->handler, &frame->ebp );
+ addr = (void *)call_unwind_func( catchblock->handler, &frame->ebp );
__wine_pop_frame( &nested_frame.frame );
((DWORD*)frame)[-1] = save_esp;
--
2.7.4
June 4, 2018
[PATCH 4/5] msvcrt: Avoid using inline assembly in call_unwind_func().
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/msvcrt/except_i386.c | 32 ++++++++++++++------------------
1 file changed, 14 insertions(+), 18 deletions(-)
diff --git a/dlls/msvcrt/except_i386.c b/dlls/msvcrt/except_i386.c
index 29540cd..42212c9 100644
--- a/dlls/msvcrt/except_i386.c
+++ b/dlls/msvcrt/except_i386.c
@@ -198,24 +198,20 @@ __ASM_GLOBAL_FUNC( call_filter,
"popl %ebp\n\t"
"ret" );
-static inline int call_unwind_func( int (*func)(void), void *ebp )
-{
- int ret;
- __asm__ __volatile__ ("pushl %%ebp\n\t"
- "pushl %%ebx\n\t"
- "pushl %%esi\n\t"
- "pushl %%edi\n\t"
- "movl %2,%%ebp\n\t"
- "call *%0\n\t"
- "popl %%edi\n\t"
- "popl %%esi\n\t"
- "popl %%ebx\n\t"
- "popl %%ebp"
- : "=a" (ret)
- : "0" (func), "r" (ebp)
- : "ecx", "edx", "memory" );
- return ret;
-}
+extern int call_unwind_func( int (*func)(void), void *ebp );
+
+__ASM_GLOBAL_FUNC( call_unwind_func,
+ "pushl %ebp\n\t"
+ "pushl %ebx\n\t"
+ "pushl %esi\n\t"
+ "pushl %edi\n\t"
+ "movl 24(%esp), %ebp\n\t"
+ "call *20(%esp)\n\t"
+ "popl %edi\n\t"
+ "popl %esi\n\t"
+ "popl %ebx\n\t"
+ "popl %ebp\n\t"
+ "ret" );
static inline void dump_type( const cxx_type_info *type )
{
--
2.7.4
June 4, 2018
[PATCH 3/5] msvcrt: Avoid using inline assembly in call_filter().
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/msvcrt/except_i386.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/dlls/msvcrt/except_i386.c b/dlls/msvcrt/except_i386.c
index 508e2ee..29540cd 100644
--- a/dlls/msvcrt/except_i386.c
+++ b/dlls/msvcrt/except_i386.c
@@ -187,15 +187,16 @@ __ASM_GLOBAL_FUNC( call_finally_block,
"movl 8(%esp), %ebp\n\t"
"jmp *4(%esp)" );
-static inline int call_filter( int (*func)(PEXCEPTION_POINTERS), void *arg, void *ebp )
-{
- int ret;
- __asm__ __volatile__ ("pushl %%ebp; pushl %3; movl %2,%%ebp; call *%%eax; popl %%ebp; popl %%ebp"
- : "=a" (ret)
- : "0" (func), "r" (ebp), "r" (arg)
- : "ecx", "edx", "memory" );
- return ret;
-}
+extern int call_filter( int (*func)(PEXCEPTION_POINTERS), void *arg, void *ebp );
+
+__ASM_GLOBAL_FUNC( call_filter,
+ "pushl %ebp\n\t"
+ "pushl 12(%esp)\n\t"
+ "movl 20(%esp), %ebp\n\t"
+ "call *12(%esp)\n\t"
+ "popl %ebp\n\t"
+ "popl %ebp\n\t"
+ "ret" );
static inline int call_unwind_func( int (*func)(void), void *ebp )
{
--
2.7.4
June 4, 2018
[PATCH 2/5] msvcrt: Avoid using inline assembly in call_finally_block().
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/msvcrt/except_i386.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/dlls/msvcrt/except_i386.c b/dlls/msvcrt/except_i386.c
index 2c845b2..508e2ee 100644
--- a/dlls/msvcrt/except_i386.c
+++ b/dlls/msvcrt/except_i386.c
@@ -181,11 +181,11 @@ __ASM_GLOBAL_FUNC( continue_after_catch,
"leal 12(%edx), %ebp\n\t"
"jmp *%eax" );
-static inline void call_finally_block( void *code_block, void *base_ptr )
-{
- __asm__ __volatile__ ("movl %1,%%ebp; call *%%eax"
- : : "a" (code_block), "g" (base_ptr));
-}
+extern void DECLSPEC_NORETURN call_finally_block( void *code_block, void *base_ptr );
+
+__ASM_GLOBAL_FUNC( call_finally_block,
+ "movl 8(%esp), %ebp\n\t"
+ "jmp *4(%esp)" );
static inline int call_filter( int (*func)(PEXCEPTION_POINTERS), void *arg, void *ebp )
{
@@ -938,7 +938,6 @@ int CDECL _except_handler3(PEXCEPTION_RECORD rec,
frame->trylevel = pScopeTable[trylevel].previousTryLevel;
TRACE("__finally block %p\n",pScopeTable[trylevel].lpfnHandler);
call_finally_block(pScopeTable[trylevel].lpfnHandler, &frame->_ebp);
- ERR("Returned from __finally block - expect crash!\n");
}
}
trylevel = pScopeTable[trylevel].previousTryLevel;
@@ -1012,7 +1011,6 @@ int CDECL _except_handler4_common( ULONG *cookie, void (*check_cookie)(void),
frame->trylevel = scope_table->entries[trylevel].previousTryLevel;
TRACE("__finally block %p\n",scope_table->entries[trylevel].lpfnHandler);
call_finally_block(scope_table->entries[trylevel].lpfnHandler, &frame->_ebp);
- ERR("Returned from __finally block - expect crash!\n");
}
}
trylevel = scope_table->entries[trylevel].previousTryLevel;
--
2.7.4
June 4, 2018
[PATCH 1/5] msvcrt: Avoid using inline assembly in continue_after_catch().
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/msvcrt/except_i386.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/dlls/msvcrt/except_i386.c b/dlls/msvcrt/except_i386.c
index ee12fb6..2c845b2 100644
--- a/dlls/msvcrt/except_i386.c
+++ b/dlls/msvcrt/except_i386.c
@@ -172,12 +172,14 @@ __ASM_GLOBAL_FUNC( call_copy_ctor,
"ret" );
/* continue execution to the specified address after exception is caught */
-static inline void DECLSPEC_NORETURN continue_after_catch( cxx_exception_frame* frame, void *addr )
-{
- __asm__ __volatile__("movl -4(%0),%%esp; leal 12(%0),%%ebp; jmp *%1"
- : : "r" (frame), "a" (addr) );
- for (;;) ; /* unreached */
-}
+extern void DECLSPEC_NORETURN continue_after_catch( cxx_exception_frame* frame, void *addr );
+
+__ASM_GLOBAL_FUNC( continue_after_catch,
+ "movl 4(%esp), %edx\n\t"
+ "movl 8(%esp), %eax\n\t"
+ "movl -4(%edx), %esp\n\t"
+ "leal 12(%edx), %ebp\n\t"
+ "jmp *%eax" );
static inline void call_finally_block( void *code_block, void *base_ptr )
{
--
2.7.4
June 4, 2018
[PATCH 5/5] dbghelp: Read the r_debug and link_map structs corresponding to the target's architecture.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/dbghelp/elf_module.c | 110 +++++++++++++++++++++++++++++++++++-----------
1 file changed, 84 insertions(+), 26 deletions(-)
diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c
index c43d108..32ce345 100644
--- a/dlls/dbghelp/elf_module.c
+++ b/dlls/dbghelp/elf_module.c
@@ -78,6 +78,15 @@ struct r_debug
};
#endif /* HAVE_STRUCT_R_DEBUG */
+struct r_debug32
+{
+ int r_version;
+ DWORD r_map;
+ Elf32_Addr r_brk;
+ int r_state;
+ Elf32_Addr r_ldbase;
+};
+
#ifndef HAVE_STRUCT_LINK_MAP
struct link_map
{
@@ -88,6 +97,14 @@ struct link_map
};
#endif /* HAVE_STRUCT_LINK_MAP */
+struct link_map32
+{
+ Elf32_Addr l_addr;
+ DWORD l_name;
+ DWORD l_ld;
+ DWORD l_next, l_prev;
+};
+
WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
struct elf_info
@@ -1648,36 +1665,77 @@ static BOOL elf_enum_modules_internal(const struct process* pcs,
const WCHAR* main_name,
enum_elf_modules_cb cb, void* user)
{
- struct r_debug dbg_hdr;
- void* lm_addr;
- struct link_map lm;
- char bufstr[256];
- WCHAR bufstrW[MAX_PATH];
+ WCHAR bufstrW[MAX_PATH];
+ char bufstr[256];
+ void *lm_addr;
- if (!pcs->dbg_hdr_addr ||
- !ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr,
- &dbg_hdr, sizeof(dbg_hdr), NULL))
- return FALSE;
-
- /* Now walk the linked list. In all known ELF implementations,
- * the dynamic loader maintains this linked list for us. In some
- * cases the first entry doesn't appear with a name, in other cases it
- * does.
- */
- for (lm_addr = (void*)dbg_hdr.r_map; lm_addr; lm_addr = (void*)lm.l_next)
+ if (pcs->is_64bit)
{
- if (!ReadProcessMemory(pcs->handle, lm_addr, &lm, sizeof(lm), NULL))
- return FALSE;
+ struct r_debug dbg_hdr;
+ struct link_map lm;
- if (lm.l_prev != NULL && /* skip first entry, normally debuggee itself */
- lm.l_name != NULL &&
- ReadProcessMemory(pcs->handle, lm.l_name, bufstr, sizeof(bufstr), NULL))
+ if (!pcs->dbg_hdr_addr ||
+ !ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr,
+ &dbg_hdr, sizeof(dbg_hdr), NULL))
+ return FALSE;
+
+ /* Now walk the linked list. In all known ELF implementations,
+ * the dynamic loader maintains this linked list for us. In some
+ * cases the first entry doesn't appear with a name, in other cases it
+ * does.
+ */
+ for (lm_addr = (void*)dbg_hdr.r_map; lm_addr; lm_addr = (void*)lm.l_next)
{
- bufstr[sizeof(bufstr) - 1] = '\0';
- MultiByteToWideChar(CP_UNIXCP, 0, bufstr, -1, bufstrW, sizeof(bufstrW) / sizeof(WCHAR));
- if (main_name && !bufstrW[0]) strcpyW(bufstrW, main_name);
- if (!cb(bufstrW, (unsigned long)lm.l_addr, (unsigned long)lm.l_ld, FALSE, user)) break;
- }
+ if (!ReadProcessMemory(pcs->handle, lm_addr, &lm, sizeof(lm), NULL))
+ return FALSE;
+
+ if (lm.l_prev != NULL && /* skip first entry, normally debuggee itself */
+ lm.l_name != NULL &&
+ ReadProcessMemory(pcs->handle, lm.l_name, bufstr, sizeof(bufstr), NULL))
+ {
+ bufstr[sizeof(bufstr) - 1] = '\0';
+ MultiByteToWideChar(CP_UNIXCP, 0, bufstr, -1, bufstrW,
+ sizeof(bufstrW) / sizeof(WCHAR));
+ if (main_name && !bufstrW[0]) strcpyW(bufstrW, main_name);
+ if (!cb(bufstrW, (unsigned long)lm.l_addr, (unsigned long)lm.l_ld, FALSE, user))
+ break;
+ }
+ }
+ }
+ else
+ {
+ struct r_debug32 dbg_hdr;
+ struct link_map32 lm;
+
+ if (!pcs->dbg_hdr_addr ||
+ !ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr,
+ &dbg_hdr, sizeof(dbg_hdr), NULL))
+ return FALSE;
+
+ /* Now walk the linked list. In all known ELF implementations,
+ * the dynamic loader maintains this linked list for us. In some
+ * cases the first entry doesn't appear with a name, in other cases it
+ * does.
+ */
+ for (lm_addr = (void *)(DWORD_PTR)dbg_hdr.r_map; lm_addr;
+ lm_addr = (void *)(DWORD_PTR)lm.l_next)
+ {
+ if (!ReadProcessMemory(pcs->handle, lm_addr, &lm, sizeof(lm), NULL))
+ return FALSE;
+
+ if (lm.l_prev && /* skip first entry, normally debuggee itself */
+ lm.l_name &&
+ ReadProcessMemory(pcs->handle, (void *)(DWORD_PTR)lm.l_name,
+ bufstr, sizeof(bufstr), NULL))
+ {
+ bufstr[sizeof(bufstr) - 1] = '\0';
+ MultiByteToWideChar(CP_UNIXCP, 0, bufstr, -1, bufstrW,
+ sizeof(bufstrW) / sizeof(WCHAR));
+ if (main_name && !bufstrW[0]) strcpyW(bufstrW, main_name);
+ if (!cb(bufstrW, (unsigned long)lm.l_addr, (unsigned long)lm.l_ld, FALSE, user))
+ break;
+ }
+ }
}
#ifdef AT_SYSINFO_EHDR
--
2.7.4
June 4, 2018
[PATCH 4/5] dbghelp: Translate the 32-bit ELF symbol struct to the 64-bit one.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/dbghelp/elf_module.c | 87 +++++++++++++++++++++++++++-----------------
dlls/dbghelp/image_private.h | 9 +----
2 files changed, 54 insertions(+), 42 deletions(-)
diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c
index 0cbeb98..c43d108 100644
--- a/dlls/dbghelp/elf_module.c
+++ b/dlls/dbghelp/elf_module.c
@@ -101,7 +101,7 @@ struct elf_info
struct symtab_elt
{
struct hash_table_elt ht_elt;
- const Elf_Sym* symp;
+ Elf64_Sym sym;
struct symt_compiland* compiland;
unsigned used;
};
@@ -548,13 +548,13 @@ static void elf_hash_symtab(struct module* module, struct pool* pool,
const char* symname;
struct symt_compiland* compiland = NULL;
const char* ptr;
- const Elf_Sym* symp;
struct symtab_elt* ste;
struct image_section_map ism, ism_str;
+ const char *symtab;
if (!elf_find_section(fmap, ".symtab", SHT_SYMTAB, &ism) &&
!elf_find_section(fmap, ".dynsym", SHT_DYNSYM, &ism)) return;
- if ((symp = (const Elf_Sym*)image_map_section(&ism)) == IMAGE_NO_MAP) return;
+ if ((symtab = image_map_section(&ism)) == IMAGE_NO_MAP) return;
ism_str.fmap = ism.fmap;
ism_str.sidx = fmap->u.elf.sect[ism.sidx].shdr.sh_link;
if ((strp = image_map_section(&ism_str)) == IMAGE_NO_MAP)
@@ -563,33 +563,50 @@ static void elf_hash_symtab(struct module* module, struct pool* pool,
return;
}
- nsym = image_get_map_size(&ism) / sizeof(*symp);
+ nsym = image_get_map_size(&ism) /
+ (fmap->addr_size == 32 ? sizeof(Elf32_Sym) : sizeof(Elf64_Sym));
for (j = 0; thunks[j].symname; j++)
thunks[j].rva_start = thunks[j].rva_end = 0;
- for (i = 0; i < nsym; i++, symp++)
+ for (i = 0; i < nsym; i++)
{
+ Elf64_Sym sym;
+
+ if (fmap->addr_size == 32)
+ {
+ Elf32_Sym *sym32 = &((Elf32_Sym *)symtab)[i];
+
+ sym.st_name = sym32->st_name;
+ sym.st_value = sym32->st_value;
+ sym.st_size = sym32->st_size;
+ sym.st_info = sym32->st_info;
+ sym.st_other = sym32->st_other;
+ sym.st_shndx = sym32->st_shndx;
+ }
+ else
+ sym = ((Elf64_Sym *)symtab)[i];
+
/* Ignore certain types of entries which really aren't of that much
* interest.
*/
- if ((ELF32_ST_TYPE(symp->st_info) != STT_NOTYPE &&
- ELF32_ST_TYPE(symp->st_info) != STT_FILE &&
- ELF32_ST_TYPE(symp->st_info) != STT_OBJECT &&
- ELF32_ST_TYPE(symp->st_info) != STT_FUNC) ||
- symp->st_shndx == SHN_UNDEF)
+ if ((ELF32_ST_TYPE(sym.st_info) != STT_NOTYPE &&
+ ELF32_ST_TYPE(sym.st_info) != STT_FILE &&
+ ELF32_ST_TYPE(sym.st_info) != STT_OBJECT &&
+ ELF32_ST_TYPE(sym.st_info) != STT_FUNC) ||
+ sym.st_shndx == SHN_UNDEF)
{
continue;
}
- symname = strp + symp->st_name;
+ symname = strp + sym.st_name;
/* handle some specific symtab (that we'll throw away when done) */
- switch (ELF32_ST_TYPE(symp->st_info))
+ switch (ELF32_ST_TYPE(sym.st_info))
{
case STT_FILE:
if (symname)
- compiland = symt_new_compiland(module, symp->st_value,
+ compiland = symt_new_compiland(module, sym.st_value,
source_new(module, NULL, symname));
else
compiland = NULL;
@@ -600,8 +617,8 @@ static void elf_hash_symtab(struct module* module, struct pool* pool,
{
if (!strcmp(symname, thunks[j].symname))
{
- thunks[j].rva_start = symp->st_value;
- thunks[j].rva_end = symp->st_value + symp->st_size;
+ thunks[j].rva_start = sym.st_value;
+ thunks[j].rva_end = sym.st_value + sym.st_size;
break;
}
}
@@ -635,7 +652,7 @@ static void elf_hash_symtab(struct module* module, struct pool* pool,
ste->ht_elt.name = n;
}
}
- ste->symp = symp;
+ ste->sym = sym;
ste->compiland = compiland;
ste->used = 0;
hash_table_add(ht_symtab, &ste->ht_elt);
@@ -651,7 +668,7 @@ static void elf_hash_symtab(struct module* module, struct pool* pool,
*
* lookup a symbol by name in our internal hash table for the symtab
*/
-static const Elf_Sym* elf_lookup_symtab(const struct module* module,
+static const Elf64_Sym *elf_lookup_symtab(const struct module* module,
const struct hash_table* ht_symtab,
const char* name, const struct symt* compiland)
{
@@ -698,8 +715,8 @@ static const Elf_Sym* elf_lookup_symtab(const struct module* module,
{
FIXME("Already found symbol %s (%s) in symtab %s @%08x and %s @%08x\n",
name, compiland_name,
- source_get(module, result->compiland->source), (unsigned int)result->symp->st_value,
- source_get(module, ste->compiland->source), (unsigned int)ste->symp->st_value);
+ source_get(module, result->compiland->source), (unsigned int)result->sym.st_value,
+ source_get(module, ste->compiland->source), (unsigned int)ste->sym.st_value);
}
else
{
@@ -713,7 +730,7 @@ static const Elf_Sym* elf_lookup_symtab(const struct module* module,
debugstr_w(module->module.ModuleName), name);
return NULL;
}
- return result->symp;
+ return &result->sym;
}
/******************************************************************
@@ -727,7 +744,7 @@ static void elf_finish_stabs_info(struct module* module, const struct hash_table
struct hash_table_iter hti;
void* ptr;
struct symt_ht* sym;
- const Elf_Sym* symp;
+ const Elf64_Sym* symp;
struct elf_module_info* elf_info = module->format_info[DFI_ELF]->u.elf_info;
hash_table_iter_init(&module->ht_symbols, &hti, NULL);
@@ -748,9 +765,10 @@ static void elf_finish_stabs_info(struct module* module, const struct hash_table
{
if (((struct symt_function*)sym)->address != elf_info->elf_addr &&
((struct symt_function*)sym)->address != elf_info->elf_addr + symp->st_value)
- FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
+ FIXME("Changing address for %p/%s!%s from %08lx to %s\n",
sym, debugstr_w(module->module.ModuleName), sym->hash_elt.name,
- ((struct symt_function*)sym)->address, elf_info->elf_addr + symp->st_value);
+ ((struct symt_function*)sym)->address,
+ wine_dbgstr_longlong(elf_info->elf_addr + symp->st_value));
if (((struct symt_function*)sym)->size && ((struct symt_function*)sym)->size != symp->st_size)
FIXME("Changing size for %p/%s!%s from %08lx to %08x\n",
sym, debugstr_w(module->module.ModuleName), sym->hash_elt.name,
@@ -776,9 +794,10 @@ static void elf_finish_stabs_info(struct module* module, const struct hash_table
{
if (((struct symt_data*)sym)->u.var.offset != elf_info->elf_addr &&
((struct symt_data*)sym)->u.var.offset != elf_info->elf_addr + symp->st_value)
- FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
+ FIXME("Changing address for %p/%s!%s from %08lx to %s\n",
sym, debugstr_w(module->module.ModuleName), sym->hash_elt.name,
- ((struct symt_function*)sym)->address, elf_info->elf_addr + symp->st_value);
+ ((struct symt_function*)sym)->address,
+ wine_dbgstr_longlong(elf_info->elf_addr + symp->st_value));
((struct symt_data*)sym)->u.var.offset = elf_info->elf_addr + symp->st_value;
((struct symt_data*)sym)->kind = (ELF32_ST_BIND(symp->st_info) == STB_LOCAL) ?
DataIsFileStatic : DataIsGlobal;
@@ -817,13 +836,13 @@ static int elf_new_wine_thunks(struct module* module, const struct hash_table* h
{
if (ste->used) continue;
- addr = module->reloc_delta + ste->symp->st_value;
+ addr = module->reloc_delta + ste->sym.st_value;
- j = elf_is_in_thunk_area(ste->symp->st_value, thunks);
+ j = elf_is_in_thunk_area(ste->sym.st_value, thunks);
if (j >= 0) /* thunk found */
{
symt_new_thunk(module, ste->compiland, ste->ht_elt.name, thunks[j].ordinal,
- addr, ste->symp->st_size);
+ addr, ste->sym.st_size);
}
else
{
@@ -839,19 +858,19 @@ static int elf_new_wine_thunks(struct module* module, const struct hash_table* h
* used yet (ie we have no debug information on them)
* That's the case, for example, of the .spec.c files
*/
- switch (ELF32_ST_TYPE(ste->symp->st_info))
+ switch (ELF32_ST_TYPE(ste->sym.st_info))
{
case STT_FUNC:
symt_new_function(module, ste->compiland, ste->ht_elt.name,
- addr, ste->symp->st_size, NULL);
+ addr, ste->sym.st_size, NULL);
break;
case STT_OBJECT:
loc.kind = loc_absolute;
loc.reg = 0;
loc.offset = addr;
symt_new_global_variable(module, ste->compiland, ste->ht_elt.name,
- ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL,
- loc, ste->symp->st_size, NULL);
+ ELF32_ST_BIND(ste->sym.st_info) == STB_LOCAL,
+ loc, ste->sym.st_size, NULL);
break;
default:
FIXME("Shouldn't happen\n");
@@ -891,8 +910,8 @@ static int elf_new_public_symbols(struct module* module, const struct hash_table
while ((ste = hash_table_iter_up(&hti)))
{
symt_new_public(module, ste->compiland, ste->ht_elt.name,
- module->reloc_delta + ste->symp->st_value,
- ste->symp->st_size);
+ module->reloc_delta + ste->sym.st_value,
+ ste->sym.st_size);
}
return TRUE;
}
diff --git a/dlls/dbghelp/image_private.h b/dlls/dbghelp/image_private.h
index e95d0d1..b12cacb 100644
--- a/dlls/dbghelp/image_private.h
+++ b/dlls/dbghelp/image_private.h
@@ -56,14 +56,7 @@ typedef struct section macho_section;
#define IMAGE_NO_MAP ((void*)-1)
-#ifdef __ELF__
-
-#ifdef _WIN64
-#define Elf_Sym Elf64_Sym
-#else
-#define Elf_Sym Elf32_Sym
-#endif
-#else
+#ifndef __ELF__
#ifndef SHT_NULL
#define SHT_NULL 0
#endif
--
2.7.4
June 4, 2018
[PATCH 3/5] dbghelp: Read the Elf_auxv_t struct corresponding to the target's architecture.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/dbghelp/elf_module.c | 30 ++++++++++++++++++++++++------
dlls/dbghelp/image_private.h | 2 --
2 files changed, 24 insertions(+), 8 deletions(-)
diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c
index 2b444f8..0cbeb98 100644
--- a/dlls/dbghelp/elf_module.c
+++ b/dlls/dbghelp/elf_module.c
@@ -1522,7 +1522,6 @@ static BOOL elf_search_auxv(const struct process* pcs, unsigned type, unsigned l
void* addr;
void* str;
void* str_max;
- Elf_auxv_t auxv;
si->SizeOfStruct = sizeof(*si);
si->MaxNameLen = MAX_SYM_NAME;
@@ -1548,14 +1547,33 @@ static BOOL elf_search_auxv(const struct process* pcs, unsigned type, unsigned l
while (addr < str_max && ReadProcessMemory(pcs->handle, addr, &str, sizeof(str), NULL) && str == NULL)
addr = (void*)((DWORD_PTR)addr + sizeof(str));
- while (ReadProcessMemory(pcs->handle, addr, &auxv, sizeof(auxv), NULL) && auxv.a_type != AT_NULL)
+ if (pcs->is_64bit)
{
- if (auxv.a_type == type)
+ Elf64_auxv_t auxv;
+
+ while (ReadProcessMemory(pcs->handle, addr, &auxv, sizeof(auxv), NULL) && auxv.a_type != AT_NULL)
{
- *val = auxv.a_un.a_val;
- return TRUE;
+ if (auxv.a_type == type)
+ {
+ *val = auxv.a_un.a_val;
+ return TRUE;
+ }
+ addr = (void*)((DWORD_PTR)addr + sizeof(auxv));
+ }
+ }
+ else
+ {
+ Elf32_auxv_t auxv;
+
+ while (ReadProcessMemory(pcs->handle, addr, &auxv, sizeof(auxv), NULL) && auxv.a_type != AT_NULL)
+ {
+ if (auxv.a_type == type)
+ {
+ *val = auxv.a_un.a_val;
+ return TRUE;
+ }
+ addr = (void*)((DWORD_PTR)addr + sizeof(auxv));
}
- addr = (void*)((DWORD_PTR)addr + sizeof(auxv));
}
return FALSE;
diff --git a/dlls/dbghelp/image_private.h b/dlls/dbghelp/image_private.h
index a0df390..e95d0d1 100644
--- a/dlls/dbghelp/image_private.h
+++ b/dlls/dbghelp/image_private.h
@@ -60,10 +60,8 @@ typedef struct section macho_section;
#ifdef _WIN64
#define Elf_Sym Elf64_Sym
-#define Elf_auxv_t Elf64_auxv_t
#else
#define Elf_Sym Elf32_Sym
-#define Elf_auxv_t Elf32_auxv_t
#endif
#else
#ifndef SHT_NULL
--
2.7.4
June 4, 2018
[PATCH 2/5] dbghelp: Read the Elf_Dyn struct corresponding to the target's architecture.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/dbghelp/elf_module.c | 59 ++++++++++++++++++++++++++++++++------------
dlls/dbghelp/image_private.h | 2 --
2 files changed, 43 insertions(+), 18 deletions(-)
diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c
index f84df83..2b444f8 100644
--- a/dlls/dbghelp/elf_module.c
+++ b/dlls/dbghelp/elf_module.c
@@ -1270,29 +1270,56 @@ static BOOL elf_load_file_from_fmap(struct process* pcs, const WCHAR* filename,
if (elf_find_section(fmap, ".dynamic", SHT_DYNAMIC, &ism))
{
- Elf_Dyn dyn;
char* ptr = (char*)(ULONG_PTR)fmap->u.elf.sect[ism.sidx].shdr.sh_addr;
unsigned long len;
if (load_offset) ptr += load_offset - fmap->u.elf.elf_start;
- do
+ if (fmap->addr_size == 32)
{
- if (!ReadProcessMemory(pcs->handle, ptr, &dyn, sizeof(dyn), &len) ||
- len != sizeof(dyn))
- return ret;
- if (dyn.d_tag == DT_DEBUG)
+ Elf32_Dyn dyn;
+
+ do
{
- elf_info->dbg_hdr_addr = dyn.d_un.d_ptr;
- if (load_offset == 0 && dyn_addr == 0) /* likely the case */
- /* Assume this module (the Wine loader) has been loaded at its preferred address */
- dyn_addr = ism.fmap->u.elf.sect[ism.sidx].shdr.sh_addr;
- break;
- }
- ptr += sizeof(dyn);
- } while (dyn.d_tag != DT_NULL);
- if (dyn.d_tag == DT_NULL) return ret;
- }
+ if (!ReadProcessMemory(pcs->handle, ptr, &dyn, sizeof(dyn), &len) ||
+ len != sizeof(dyn))
+ return ret;
+ if (dyn.d_tag == DT_DEBUG)
+ {
+ elf_info->dbg_hdr_addr = dyn.d_un.d_ptr;
+ if (load_offset == 0 && dyn_addr == 0) /* likely the case */
+ /* Assume this module (the Wine loader) has been
+ * loaded at its preferred address */
+ dyn_addr = ism.fmap->u.elf.sect[ism.sidx].shdr.sh_addr;
+ break;
+ }
+ ptr += sizeof(dyn);
+ } while (dyn.d_tag != DT_NULL);
+ if (dyn.d_tag == DT_NULL) return ret;
+ }
+ else
+ {
+ Elf64_Dyn dyn;
+
+ do
+ {
+ if (!ReadProcessMemory(pcs->handle, ptr, &dyn, sizeof(dyn), &len) ||
+ len != sizeof(dyn))
+ return ret;
+ if (dyn.d_tag == DT_DEBUG)
+ {
+ elf_info->dbg_hdr_addr = dyn.d_un.d_ptr;
+ if (load_offset == 0 && dyn_addr == 0) /* likely the case */
+ /* Assume this module (the Wine loader) has been
+ * loaded at its preferred address */
+ dyn_addr = ism.fmap->u.elf.sect[ism.sidx].shdr.sh_addr;
+ break;
+ }
+ ptr += sizeof(dyn);
+ } while (dyn.d_tag != DT_NULL);
+ if (dyn.d_tag == DT_NULL) return ret;
+ }
+ }
elf_end_find(fmap);
}
diff --git a/dlls/dbghelp/image_private.h b/dlls/dbghelp/image_private.h
index 3951464..a0df390 100644
--- a/dlls/dbghelp/image_private.h
+++ b/dlls/dbghelp/image_private.h
@@ -59,11 +59,9 @@ typedef struct section macho_section;
#ifdef __ELF__
#ifdef _WIN64
-#define Elf_Dyn Elf64_Dyn
#define Elf_Sym Elf64_Sym
#define Elf_auxv_t Elf64_auxv_t
#else
-#define Elf_Dyn Elf32_Dyn
#define Elf_Sym Elf32_Sym
#define Elf_auxv_t Elf32_auxv_t
#endif
--
2.7.4
June 4, 2018