Commit afc2df87 authored by Frank Richter's avatar Frank Richter Committed by Alexandre Julliard

dbghelp: Split gnu_debuglink handling into own function.

parent 6d49fb12
...@@ -778,6 +778,51 @@ static DWORD calc_crc32(struct elf_file_map* fmap) ...@@ -778,6 +778,51 @@ static DWORD calc_crc32(struct elf_file_map* fmap)
#undef UPDC32 #undef UPDC32
} }
static BOOL elf_load_debug_info_from_map(struct module* module,
struct elf_file_map* fmap,
struct pool* pool,
struct hash_table* ht_symtab);
/******************************************************************
* elf_debuglink_parse
*
* Parses a .gnu_debuglink section and loads the debug info from
* the external file specified there.
*/
static BOOL elf_debuglink_parse (struct module* module,
struct pool* pool,
struct hash_table* ht_symtab,
const BYTE* debuglink)
{
/* The content of a debug link section is:
* 1/ a NULL terminated string, containing the file name for the
* debug info
* 2/ padding on 4 byte boundary
* 3/ CRC of the linked ELF file
*/
BOOL ret = FALSE, lret;
const char* dbg_link = (char*)debuglink;
struct elf_file_map fmap_link;
if (elf_map_file(dbg_link, &fmap_link))
{
fmap_link.crc = *(const DWORD*)(dbg_link + ((DWORD_PTR)(strlen(dbg_link) + 4) & ~3));
fmap_link.with_crc = 1;
lret = elf_load_debug_info_from_map(module, &fmap_link, pool,
ht_symtab);
if (lret)
strcpy(module->module.LoadedPdbName, dbg_link);
else
WARN("Couldn't load debug information from %s\n", dbg_link);
ret = ret || lret;
elf_unmap_file(&fmap_link);
}
else
WARN("Couldn't map %s\n", dbg_link);
return ret;
}
/****************************************************************** /******************************************************************
* elf_load_debug_info_from_map * elf_load_debug_info_from_map
* *
...@@ -943,32 +988,18 @@ static BOOL elf_load_debug_info_from_map(struct module* module, ...@@ -943,32 +988,18 @@ static BOOL elf_load_debug_info_from_map(struct module* module,
} }
if (debuglink_sect != -1) if (debuglink_sect != -1)
{ {
const char* dbg_link; const BYTE* dbg_link;
struct elf_file_map fmap_link;
dbg_link = (const BYTE*) elf_map_section(fmap, debuglink_sect);
dbg_link = elf_map_section(fmap, debuglink_sect); if (dbg_link != ELF_NO_MAP)
/* The content of a debug link section is:
* 1/ a NULL terminated string, containing the file name for the
* debug info
* 2/ padding on 4 byte boundary
* 3/ CRC of the linked ELF file
*/
if (dbg_link != ELF_NO_MAP && elf_map_file(dbg_link, &fmap_link))
{ {
fmap_link.crc = *(const DWORD*)(dbg_link + ((DWORD_PTR)(strlen(dbg_link) + 4) & ~3)); lret = elf_debuglink_parse (module, pool, ht_symtab, dbg_link);
fmap_link.with_crc = 1; if (!lret)
lret = elf_load_debug_info_from_map(module, &fmap_link, pool, WARN("Couldn't load linked debug file for %s\n",
ht_symtab); module->module.ModuleName);
if (lret)
strcpy(module->module.LoadedPdbName, dbg_link);
else
WARN("Couldn't load debug information from %s\n", dbg_link);
ret = ret || lret; ret = ret || lret;
elf_unmap_file(&fmap_link);
} }
else elf_unmap_section(fmap, debuglink_sect);
WARN("Couldn't load linked debug file for %s\n",
module->module.ModuleName);
} }
} }
if (strstr(module->module.ModuleName, "<elf>") || if (strstr(module->module.ModuleName, "<elf>") ||
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment