From 905ab99815eff344de3a5c5dffdcf5ec83cdb45c Mon Sep 17 00:00:00 2001 From: Ken Thomases Date: Mon, 6 Apr 2009 21:40:16 -0500 Subject: [PATCH] dbghelp/stabs: For Mach-O, line offset is relative to original function address. --- dlls/dbghelp/stabs.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/dlls/dbghelp/stabs.c b/dlls/dbghelp/stabs.c index b2df46a28df..f6199f3cea8 100644 --- a/dlls/dbghelp/stabs.c +++ b/dlls/dbghelp/stabs.c @@ -1131,6 +1131,7 @@ struct pending_line int source_idx; int line_num; unsigned long offset; + unsigned long load_offset; }; struct pending_object @@ -1177,13 +1178,15 @@ static inline void pending_add_var(struct pending_list* pending, const char* nam } static inline void pending_add_line(struct pending_list* pending, int source_idx, - int line_num, unsigned long offset) + int line_num, unsigned long offset, + unsigned long load_offset) { pending_make_room(pending); pending->objs[pending->num].tag = PENDING_LINE; pending->objs[pending->num].u.line.source_idx = source_idx; pending->objs[pending->num].u.line.line_num = line_num; pending->objs[pending->num].u.line.offset = offset; + pending->objs[pending->num].u.line.load_offset = load_offset; pending->num++; } @@ -1203,7 +1206,7 @@ static void pending_flush(struct pending_list* pending, struct module* module, break; case PENDING_LINE: if (module->type == DMT_MACHO) - pending->objs[i].u.line.offset -= func->address; + pending->objs[i].u.line.offset -= func->address - pending->objs[i].u.line.load_offset; symt_add_func_line(module, func, pending->objs[i].u.line.source_idx, pending->objs[i].u.line.line_num, pending->objs[i].u.line.offset); break; @@ -1489,12 +1492,12 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset, { unsigned long offset = stab_ptr->n_value; if (module->type == DMT_MACHO) - offset -= curr_func->address; + offset -= curr_func->address - load_offset; symt_add_func_line(module, curr_func, source_idx, stab_ptr->n_desc, offset); } else pending_add_line(&pending_func, source_idx, stab_ptr->n_desc, - stab_ptr->n_value); + stab_ptr->n_value, load_offset); break; case N_FUN: /*