dbghelp: Handle the .gnu_debuglink files with the newly added alternate mechanism.
[wine/multimedia.git] / dlls / dbghelp / elf_module.c
blob4b67ee13247fd653574d2948782b87d337ac7eff
1 /*
2 * File elf.c - processing of ELF files
4 * Copyright (C) 1996, Eric Youngdale.
5 * 1999-2007 Eric Pouech
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "config.h"
23 #include "wine/port.h"
25 #if defined(__svr4__) || defined(__sun)
26 #define __ELF__
27 /* large files are not supported by libelf */
28 #undef _FILE_OFFSET_BITS
29 #define _FILE_OFFSET_BITS 32
30 #endif
32 #include <assert.h>
33 #include <stdio.h>
34 #include <stdlib.h>
35 #ifdef HAVE_SYS_STAT_H
36 # include <sys/stat.h>
37 #endif
38 #include <fcntl.h>
39 #ifdef HAVE_SYS_MMAN_H
40 #include <sys/mman.h>
41 #endif
42 #ifdef HAVE_UNISTD_H
43 # include <unistd.h>
44 #endif
45 #ifndef PATH_MAX
46 #define PATH_MAX MAX_PATH
47 #endif
49 #include "dbghelp_private.h"
51 #ifdef HAVE_ELF_H
52 # include <elf.h>
53 #endif
54 #ifdef HAVE_SYS_ELF32_H
55 # include <sys/elf32.h>
56 #endif
57 #ifdef HAVE_SYS_EXEC_ELF_H
58 # include <sys/exec_elf.h>
59 #endif
60 #if !defined(DT_NUM)
61 # if defined(DT_COUNT)
62 # define DT_NUM DT_COUNT
63 # else
64 /* this seems to be a satisfactory value on Solaris, which doesn't support this AFAICT */
65 # define DT_NUM 24
66 # endif
67 #endif
68 #ifdef HAVE_LINK_H
69 # include <link.h>
70 #endif
71 #ifdef HAVE_SYS_LINK_H
72 # include <sys/link.h>
73 #endif
75 #include "wine/library.h"
76 #include "wine/debug.h"
78 struct elf_module_info
80 unsigned long elf_addr;
81 unsigned short elf_mark : 1,
82 elf_loader : 1;
85 #ifdef __ELF__
87 #define ELF_INFO_DEBUG_HEADER 0x0001
88 #define ELF_INFO_MODULE 0x0002
89 #define ELF_INFO_NAME 0x0004
91 WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
93 struct elf_info
95 unsigned flags; /* IN one (or several) of the ELF_INFO constants */
96 unsigned long dbg_hdr_addr; /* OUT address of debug header (if ELF_INFO_DEBUG_HEADER is set) */
97 struct module* module; /* OUT loaded module (if ELF_INFO_MODULE is set) */
98 const WCHAR* module_name; /* OUT found module name (if ELF_INFO_NAME is set) */
101 /* structure holding information while handling an ELF image
102 * allows one by one section mapping for memory savings
104 struct elf_file_map
106 Elf32_Ehdr elfhdr;
107 size_t elf_size;
108 size_t elf_start;
109 struct
111 Elf32_Shdr shdr;
112 const char* mapped;
113 }* sect;
114 int fd;
115 const char* shstrtab;
116 struct elf_file_map* alternate; /* another ELF file (linked to this one) */
119 struct elf_section_map
121 struct elf_file_map* fmap;
122 unsigned sidx;
125 struct symtab_elt
127 struct hash_table_elt ht_elt;
128 const Elf32_Sym* symp;
129 struct symt_compiland* compiland;
130 unsigned used;
133 struct elf_thunk_area
135 const char* symname;
136 THUNK_ORDINAL ordinal;
137 unsigned long rva_start;
138 unsigned long rva_end;
141 /******************************************************************
142 * elf_map_section
144 * Maps a single section into memory from an ELF file
146 static const char* elf_map_section(struct elf_section_map* esm)
148 unsigned pgsz = getpagesize();
149 unsigned ofst, size;
151 if (esm->sidx < 0 || esm->sidx >= esm->fmap->elfhdr.e_shnum ||
152 esm->fmap->sect[esm->sidx].shdr.sh_type == SHT_NOBITS)
153 return ELF_NO_MAP;
155 /* align required information on page size (we assume pagesize is a power of 2) */
156 ofst = esm->fmap->sect[esm->sidx].shdr.sh_offset & ~(pgsz - 1);
157 size = ((esm->fmap->sect[esm->sidx].shdr.sh_offset +
158 esm->fmap->sect[esm->sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1)) - ofst;
159 esm->fmap->sect[esm->sidx].mapped = mmap(NULL, size, PROT_READ, MAP_PRIVATE,
160 esm->fmap->fd, ofst);
161 if (esm->fmap->sect[esm->sidx].mapped == ELF_NO_MAP) return ELF_NO_MAP;
162 return esm->fmap->sect[esm->sidx].mapped + (esm->fmap->sect[esm->sidx].shdr.sh_offset & (pgsz - 1));
165 /******************************************************************
166 * elf_find_section
168 * Finds a section by name (and type) into memory from an ELF file
169 * or its alternate if any
171 static BOOL elf_find_section(struct elf_file_map* fmap, const char* name,
172 unsigned sht, struct elf_section_map* esm)
174 unsigned i;
176 while (fmap)
178 if (fmap->shstrtab == ELF_NO_MAP)
180 struct elf_section_map hdr_esm = {fmap, fmap->elfhdr.e_shstrndx};
181 fmap->shstrtab = elf_map_section(&hdr_esm);
182 if (fmap->shstrtab == ELF_NO_MAP) return FALSE;
184 for (i = 0; i < fmap->elfhdr.e_shnum; i++)
186 if (strcmp(fmap->shstrtab + fmap->sect[i].shdr.sh_name, name) == 0 &&
187 (sht == SHT_NULL || sht == fmap->sect[i].shdr.sh_type))
189 esm->fmap = fmap;
190 esm->sidx = i;
191 return TRUE;
194 fmap = fmap->alternate;
196 return FALSE;
199 /******************************************************************
200 * elf_unmap_section
202 * Unmaps a single section from memory
204 static void elf_unmap_section(struct elf_section_map* esm)
206 if (esm->sidx >= 0 && esm->sidx < esm->fmap->elfhdr.e_shnum && esm->fmap->sect[esm->sidx].mapped != ELF_NO_MAP)
208 unsigned pgsz = getpagesize();
209 unsigned ofst, size;
211 ofst = esm->fmap->sect[esm->sidx].shdr.sh_offset & ~(pgsz - 1);
212 size = ((esm->fmap->sect[esm->sidx].shdr.sh_offset +
213 esm->fmap->sect[esm->sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1)) - ofst;
214 if (munmap((char*)esm->fmap->sect[esm->sidx].mapped, size) < 0)
215 WARN("Couldn't unmap the section\n");
216 esm->fmap->sect[esm->sidx].mapped = ELF_NO_MAP;
220 static void elf_end_find(struct elf_file_map* fmap)
222 struct elf_section_map esm;
224 while (fmap)
226 esm.fmap = fmap;
227 esm.sidx = fmap->elfhdr.e_shstrndx;
228 elf_unmap_section(&esm);
229 fmap->shstrtab = ELF_NO_MAP;
230 fmap = fmap->alternate;
234 /******************************************************************
235 * elf_get_map_size
237 * Get the size of an ELF section
239 static inline unsigned elf_get_map_size(struct elf_section_map* esm)
241 if (esm->sidx < 0 || esm->sidx >= esm->fmap->elfhdr.e_shnum)
242 return 0;
243 return esm->fmap->sect[esm->sidx].shdr.sh_size;
246 /******************************************************************
247 * elf_map_file
249 * Maps an ELF file into memory (and checks it's a real ELF file)
251 static BOOL elf_map_file(const WCHAR* filenameW, struct elf_file_map* fmap)
253 static const BYTE elf_signature[4] = { ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3 };
254 struct stat statbuf;
255 int i;
256 Elf32_Phdr phdr;
257 unsigned tmp, page_mask = getpagesize() - 1;
258 char* filename;
259 unsigned len;
260 BOOL ret = FALSE;
262 len = WideCharToMultiByte(CP_UNIXCP, 0, filenameW, -1, NULL, 0, NULL, NULL);
263 if (!(filename = HeapAlloc(GetProcessHeap(), 0, len))) return FALSE;
264 WideCharToMultiByte(CP_UNIXCP, 0, filenameW, -1, filename, len, NULL, NULL);
266 fmap->fd = -1;
267 fmap->shstrtab = ELF_NO_MAP;
268 fmap->alternate = NULL;
270 /* check that the file exists, and that the module hasn't been loaded yet */
271 if (stat(filename, &statbuf) == -1 || S_ISDIR(statbuf.st_mode)) goto done;
273 /* Now open the file, so that we can mmap() it. */
274 if ((fmap->fd = open(filename, O_RDONLY)) == -1) goto done;
276 if (read(fmap->fd, &fmap->elfhdr, sizeof(fmap->elfhdr)) != sizeof(fmap->elfhdr))
277 goto done;
278 /* and check for an ELF header */
279 if (memcmp(fmap->elfhdr.e_ident,
280 elf_signature, sizeof(elf_signature))) goto done;
282 fmap->sect = HeapAlloc(GetProcessHeap(), 0,
283 fmap->elfhdr.e_shnum * sizeof(fmap->sect[0]));
284 if (!fmap->sect) goto done;
286 lseek(fmap->fd, fmap->elfhdr.e_shoff, SEEK_SET);
287 for (i = 0; i < fmap->elfhdr.e_shnum; i++)
289 read(fmap->fd, &fmap->sect[i].shdr, sizeof(fmap->sect[i].shdr));
290 fmap->sect[i].mapped = ELF_NO_MAP;
293 /* grab size of module once loaded in memory */
294 lseek(fmap->fd, fmap->elfhdr.e_phoff, SEEK_SET);
295 fmap->elf_size = 0;
296 fmap->elf_start = ~0L;
297 for (i = 0; i < fmap->elfhdr.e_phnum; i++)
299 if (read(fmap->fd, &phdr, sizeof(phdr)) == sizeof(phdr) &&
300 phdr.p_type == PT_LOAD)
302 tmp = (phdr.p_vaddr + phdr.p_memsz + page_mask) & ~page_mask;
303 if (fmap->elf_size < tmp) fmap->elf_size = tmp;
304 if (phdr.p_vaddr < fmap->elf_start) fmap->elf_start = phdr.p_vaddr;
307 /* if non relocatable ELF, then remove fixed address from computation
308 * otherwise, all addresses are zero based and start has no effect
310 fmap->elf_size -= fmap->elf_start;
311 ret = TRUE;
312 done:
313 HeapFree(GetProcessHeap(), 0, filename);
314 return ret;
317 /******************************************************************
318 * elf_unmap_file
320 * Unmaps an ELF file from memory (previously mapped with elf_map_file)
322 static void elf_unmap_file(struct elf_file_map* fmap)
324 while (fmap)
326 if (fmap->fd != -1)
328 struct elf_section_map esm;
329 esm.fmap = fmap;
330 for (esm.sidx = 0; esm.sidx < fmap->elfhdr.e_shnum; esm.sidx++)
332 elf_unmap_section(&esm);
334 HeapFree(GetProcessHeap(), 0, fmap->sect);
335 close(fmap->fd);
337 fmap = fmap->alternate;
341 /******************************************************************
342 * elf_is_in_thunk_area
344 * Check whether an address lies within one of the thunk area we
345 * know of.
347 int elf_is_in_thunk_area(unsigned long addr,
348 const struct elf_thunk_area* thunks)
350 unsigned i;
352 for (i = 0; thunks[i].symname; i++)
354 if (addr >= thunks[i].rva_start && addr < thunks[i].rva_end)
355 return i;
357 return -1;
360 /******************************************************************
361 * elf_hash_symtab
363 * creating an internal hash table to ease use ELF symtab information lookup
365 static void elf_hash_symtab(struct module* module, struct pool* pool,
366 struct hash_table* ht_symtab, struct elf_file_map* fmap,
367 struct elf_thunk_area* thunks)
369 int i, j, nsym;
370 const char* strp;
371 const char* symname;
372 struct symt_compiland* compiland = NULL;
373 const char* ptr;
374 const Elf32_Sym* symp;
375 struct symtab_elt* ste;
376 struct elf_section_map esm, esm_str;
378 if (!elf_find_section(fmap, ".symtab", SHT_SYMTAB, &esm) &&
379 !elf_find_section(fmap, ".dynsym", SHT_DYNSYM, &esm)) return;
380 if ((symp = (const Elf32_Sym*)elf_map_section(&esm)) == ELF_NO_MAP) return;
381 esm_str.fmap = fmap;
382 esm_str.sidx = fmap->sect[esm.sidx].shdr.sh_link;
383 if ((strp = elf_map_section(&esm_str)) == ELF_NO_MAP) return;
385 nsym = elf_get_map_size(&esm) / sizeof(*symp);
387 for (j = 0; thunks[j].symname; j++)
388 thunks[j].rva_start = thunks[j].rva_end = 0;
390 for (i = 0; i < nsym; i++, symp++)
392 /* Ignore certain types of entries which really aren't of that much
393 * interest.
395 if ((ELF32_ST_TYPE(symp->st_info) != STT_NOTYPE &&
396 ELF32_ST_TYPE(symp->st_info) != STT_FILE &&
397 ELF32_ST_TYPE(symp->st_info) != STT_OBJECT &&
398 ELF32_ST_TYPE(symp->st_info) != STT_FUNC) ||
399 symp->st_shndx == SHN_UNDEF)
401 continue;
404 symname = strp + symp->st_name;
406 /* handle some specific symtab (that we'll throw away when done) */
407 switch (ELF32_ST_TYPE(symp->st_info))
409 case STT_FILE:
410 if (symname)
411 compiland = symt_new_compiland(module, symp->st_value,
412 source_new(module, NULL, symname));
413 else
414 compiland = NULL;
415 continue;
416 case STT_NOTYPE:
417 /* we are only interested in wine markers inserted by winebuild */
418 for (j = 0; thunks[j].symname; j++)
420 if (!strcmp(symname, thunks[j].symname))
422 thunks[j].rva_start = symp->st_value;
423 thunks[j].rva_end = symp->st_value + symp->st_size;
424 break;
427 continue;
430 /* FIXME: we don't need to handle them (GCC internals)
431 * Moreover, they screw up our symbol lookup :-/
433 if (symname[0] == '.' && symname[1] == 'L' && isdigit(symname[2]))
434 continue;
436 ste = pool_alloc(pool, sizeof(*ste));
437 ste->ht_elt.name = symname;
438 /* GCC emits, in some cases, a .<digit>+ suffix.
439 * This is used for static variable inside functions, so
440 * that we can have several such variables with same name in
441 * the same compilation unit
442 * We simply ignore that suffix when present (we also get rid
443 * of it in stabs parsing)
445 ptr = symname + strlen(symname) - 1;
446 if (isdigit(*ptr))
448 while (isdigit(*ptr) && ptr >= symname) ptr--;
449 if (ptr > symname && *ptr == '.')
451 char* n = pool_alloc(pool, ptr - symname + 1);
452 memcpy(n, symname, ptr - symname + 1);
453 n[ptr - symname] = '\0';
454 ste->ht_elt.name = n;
457 ste->symp = symp;
458 ste->compiland = compiland;
459 ste->used = 0;
460 hash_table_add(ht_symtab, &ste->ht_elt);
462 /* as we added in the ht_symtab pointers to the symbols themselves,
463 * we cannot unmap yet the sections, it will be done when we're over
464 * with this ELF file
468 /******************************************************************
469 * elf_lookup_symtab
471 * lookup a symbol by name in our internal hash table for the symtab
473 static const Elf32_Sym* elf_lookup_symtab(const struct module* module,
474 const struct hash_table* ht_symtab,
475 const char* name, struct symt* compiland)
477 struct symtab_elt* weak_result = NULL; /* without compiland name */
478 struct symtab_elt* result = NULL;
479 struct hash_table_iter hti;
480 struct symtab_elt* ste;
481 const char* compiland_name;
482 const char* compiland_basename;
483 const char* base;
485 /* we need weak match up (at least) when symbols of same name,
486 * defined several times in different compilation units,
487 * are merged in a single one (hence a different filename for c.u.)
489 if (compiland)
491 compiland_name = source_get(module,
492 ((struct symt_compiland*)compiland)->source);
493 compiland_basename = strrchr(compiland_name, '/');
494 if (!compiland_basename++) compiland_basename = compiland_name;
496 else compiland_name = compiland_basename = NULL;
498 hash_table_iter_init(ht_symtab, &hti, name);
499 while ((ste = hash_table_iter_up(&hti)))
501 if (ste->used || strcmp(ste->ht_elt.name, name)) continue;
503 weak_result = ste;
504 if ((ste->compiland && !compiland_name) || (!ste->compiland && compiland_name))
505 continue;
506 if (ste->compiland && compiland_name)
508 const char* filename = source_get(module, ste->compiland->source);
509 if (strcmp(filename, compiland_name))
511 base = strrchr(filename, '/');
512 if (!base++) base = filename;
513 if (strcmp(base, compiland_basename)) continue;
516 if (result)
518 FIXME("Already found symbol %s (%s) in symtab %s @%08x and %s @%08x\n",
519 name, compiland_name,
520 source_get(module, result->compiland->source), result->symp->st_value,
521 source_get(module, ste->compiland->source), ste->symp->st_value);
523 else
525 result = ste;
526 ste->used = 1;
529 if (!result && !(result = weak_result))
531 FIXME("Couldn't find symbol %s!%s in symtab\n",
532 module->module_name, name);
533 return NULL;
535 return result->symp;
538 /******************************************************************
539 * elf_finish_stabs_info
541 * - get any relevant information (address & size) from the bits we got from the
542 * stabs debugging information
544 static void elf_finish_stabs_info(struct module* module, struct hash_table* symtab)
546 struct hash_table_iter hti;
547 void* ptr;
548 struct symt_ht* sym;
549 const Elf32_Sym* symp;
551 hash_table_iter_init(&module->ht_symbols, &hti, NULL);
552 while ((ptr = hash_table_iter_up(&hti)))
554 sym = GET_ENTRY(ptr, struct symt_ht, hash_elt);
555 switch (sym->symt.tag)
557 case SymTagFunction:
558 if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
559 ((struct symt_function*)sym)->size)
561 break;
563 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name,
564 ((struct symt_function*)sym)->container);
565 if (symp)
567 if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
568 ((struct symt_function*)sym)->address != module->elf_info->elf_addr + symp->st_value)
569 FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
570 sym, module->module_name, sym->hash_elt.name,
571 ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
572 if (((struct symt_function*)sym)->size && ((struct symt_function*)sym)->size != symp->st_size)
573 FIXME("Changing size for %p/%s!%s from %08lx to %08x\n",
574 sym, module->module_name, sym->hash_elt.name,
575 ((struct symt_function*)sym)->size, symp->st_size);
577 ((struct symt_function*)sym)->address = module->elf_info->elf_addr +
578 symp->st_value;
579 ((struct symt_function*)sym)->size = symp->st_size;
580 } else FIXME("Couldn't find %s!%s\n", module->module_name, sym->hash_elt.name);
581 break;
582 case SymTagData:
583 switch (((struct symt_data*)sym)->kind)
585 case DataIsGlobal:
586 case DataIsFileStatic:
587 if (((struct symt_data*)sym)->u.var.offset != module->elf_info->elf_addr)
588 break;
589 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name,
590 ((struct symt_data*)sym)->container);
591 if (symp)
593 if (((struct symt_data*)sym)->u.var.offset != module->elf_info->elf_addr &&
594 ((struct symt_data*)sym)->u.var.offset != module->elf_info->elf_addr + symp->st_value)
595 FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
596 sym, module->module_name, sym->hash_elt.name,
597 ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
598 ((struct symt_data*)sym)->u.var.offset = module->elf_info->elf_addr +
599 symp->st_value;
600 ((struct symt_data*)sym)->kind = (ELF32_ST_BIND(symp->st_info) == STB_LOCAL) ?
601 DataIsFileStatic : DataIsGlobal;
602 } else FIXME("Couldn't find %s!%s\n", module->module_name, sym->hash_elt.name);
603 break;
604 default:;
606 break;
607 default:
608 FIXME("Unsupported tag %u\n", sym->symt.tag);
609 break;
612 /* since we may have changed some addresses & sizes, mark the module to be resorted */
613 module->sortlist_valid = FALSE;
616 /******************************************************************
617 * elf_load_wine_thunks
619 * creating the thunk objects for a wine native DLL
621 static int elf_new_wine_thunks(struct module* module, struct hash_table* ht_symtab,
622 const struct elf_thunk_area* thunks)
624 int j;
625 struct hash_table_iter hti;
626 struct symtab_elt* ste;
627 DWORD addr;
628 struct symt_ht* symt;
630 hash_table_iter_init(ht_symtab, &hti, NULL);
631 while ((ste = hash_table_iter_up(&hti)))
633 if (ste->used) continue;
635 addr = module->elf_info->elf_addr + ste->symp->st_value;
637 j = elf_is_in_thunk_area(ste->symp->st_value, thunks);
638 if (j >= 0) /* thunk found */
640 symt_new_thunk(module, ste->compiland, ste->ht_elt.name, thunks[j].ordinal,
641 addr, ste->symp->st_size);
643 else
645 ULONG64 ref_addr;
647 symt = symt_find_nearest(module, addr);
648 if (symt)
649 symt_get_info(&symt->symt, TI_GET_ADDRESS, &ref_addr);
650 if (!symt || addr != ref_addr)
652 /* creating public symbols for all the ELF symbols which haven't been
653 * used yet (ie we have no debug information on them)
654 * That's the case, for example, of the .spec.c files
656 switch (ELF32_ST_TYPE(ste->symp->st_info))
658 case STT_FUNC:
659 symt_new_function(module, ste->compiland, ste->ht_elt.name,
660 addr, ste->symp->st_size, NULL);
661 break;
662 case STT_OBJECT:
663 symt_new_global_variable(module, ste->compiland, ste->ht_elt.name,
664 ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL,
665 addr, ste->symp->st_size, NULL);
666 break;
667 default:
668 FIXME("Shouldn't happen\n");
669 break;
671 /* FIXME: this is a hack !!!
672 * we are adding new symbols, but as we're parsing a symbol table
673 * (hopefully without duplicate symbols) we delay rebuilding the sorted
674 * module table until we're done with the symbol table
675 * Otherwise, as we intertwine symbols's add and lookup, performance
676 * is rather bad
678 module->sortlist_valid = TRUE;
680 else if (strcmp(ste->ht_elt.name, symt->hash_elt.name))
682 ULONG64 xaddr = 0, xsize = 0;
683 DWORD kind = -1;
685 symt_get_info(&symt->symt, TI_GET_ADDRESS, &xaddr);
686 symt_get_info(&symt->symt, TI_GET_LENGTH, &xsize);
687 symt_get_info(&symt->symt, TI_GET_DATAKIND, &kind);
689 /* If none of symbols has a correct size, we consider they are both markers
690 * Hence, we can silence this warning
691 * Also, we check that we don't have two symbols, one local, the other
692 * global which is legal
694 if ((xsize || ste->symp->st_size) &&
695 (kind == (ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL) ? DataIsFileStatic : DataIsGlobal))
696 FIXME("Duplicate in %s: %s<%08x-%08x> %s<%s-%s>\n",
697 module->module_name,
698 ste->ht_elt.name, addr, ste->symp->st_size,
699 symt->hash_elt.name,
700 wine_dbgstr_longlong(xaddr), wine_dbgstr_longlong(xsize));
704 /* see comment above */
705 module->sortlist_valid = FALSE;
706 return TRUE;
709 /******************************************************************
710 * elf_new_public_symbols
712 * Creates a set of public symbols from an ELF symtab
714 static int elf_new_public_symbols(struct module* module, struct hash_table* symtab)
716 struct hash_table_iter hti;
717 struct symtab_elt* ste;
719 if (dbghelp_options & SYMOPT_NO_PUBLICS) return TRUE;
721 /* FIXME: we're missing the ELF entry point here */
723 hash_table_iter_init(symtab, &hti, NULL);
724 while ((ste = hash_table_iter_up(&hti)))
726 symt_new_public(module, ste->compiland, ste->ht_elt.name,
727 module->elf_info->elf_addr + ste->symp->st_value,
728 ste->symp->st_size, TRUE /* FIXME */,
729 ELF32_ST_TYPE(ste->symp->st_info) == STT_FUNC);
731 return TRUE;
734 /* Copyright (C) 1986 Gary S. Brown. Modified by Robert Shearman. You may use
735 the following calc_crc32 code or tables extracted from it, as desired without
736 restriction. */
738 /**********************************************************************\
739 |* Demonstration program to compute the 32-bit CRC used as the frame *|
740 |* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 *|
741 |* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level *|
742 |* protocol). The 32-bit FCS was added via the Federal Register, *|
743 |* 1 June 1982, p.23798. I presume but don't know for certain that *|
744 |* this polynomial is or will be included in CCITT V.41, which *|
745 |* defines the 16-bit CRC (often called CRC-CCITT) polynomial. FIPS *|
746 |* PUB 78 says that the 32-bit FCS reduces otherwise undetected *|
747 |* errors by a factor of 10^-5 over 16-bit FCS. *|
748 \**********************************************************************/
750 /* First, the polynomial itself and its table of feedback terms. The */
751 /* polynomial is */
752 /* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */
753 /* Note that we take it "backwards" and put the highest-order term in */
754 /* the lowest-order bit. The X^32 term is "implied"; the LSB is the */
755 /* X^31 term, etc. The X^0 term (usually shown as "+1") results in */
756 /* the MSB being 1. */
758 /* Note that the usual hardware shift register implementation, which */
759 /* is what we're using (we're merely optimizing it by doing eight-bit */
760 /* chunks at a time) shifts bits into the lowest-order term. In our */
761 /* implementation, that means shifting towards the right. Why do we */
762 /* do it this way? Because the calculated CRC must be transmitted in */
763 /* order from highest-order term to lowest-order term. UARTs transmit */
764 /* characters in order from LSB to MSB. By storing the CRC this way, */
765 /* we hand it to the UART in the order low-byte to high-byte; the UART */
766 /* sends each low-bit to hight-bit; and the result is transmission bit */
767 /* by bit from highest- to lowest-order term without requiring any bit */
768 /* shuffling on our part. Reception works similarly. */
770 /* The feedback terms table consists of 256, 32-bit entries. Notes: */
771 /* */
772 /* 1. The table can be generated at runtime if desired; code to do so */
773 /* is shown later. It might not be obvious, but the feedback */
774 /* terms simply represent the results of eight shift/xor opera- */
775 /* tions for all combinations of data and CRC register values. */
776 /* */
777 /* 2. The CRC accumulation logic is the same for all CRC polynomials, */
778 /* be they sixteen or thirty-two bits wide. You simply choose the */
779 /* appropriate table. Alternatively, because the table can be */
780 /* generated at runtime, you can start by generating the table for */
781 /* the polynomial in question and use exactly the same "updcrc", */
782 /* if your application needn't simultaneously handle two CRC */
783 /* polynomials. (Note, however, that XMODEM is strange.) */
784 /* */
785 /* 3. For 16-bit CRCs, the table entries need be only 16 bits wide; */
786 /* of course, 32-bit entries work OK if the high 16 bits are zero. */
787 /* */
788 /* 4. The values must be right-shifted by eight bits by the "updcrc" */
789 /* logic; the shift must be unsigned (bring in zeroes). On some */
790 /* hardware you could probably optimize the shift in assembler by */
791 /* using byte-swap instructions. */
794 static DWORD calc_crc32(struct elf_file_map* fmap)
796 #define UPDC32(octet,crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
797 static const DWORD crc_32_tab[] =
798 { /* CRC polynomial 0xedb88320 */
799 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
800 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
801 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
802 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
803 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
804 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
805 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
806 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
807 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
808 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
809 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
810 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
811 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
812 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
813 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
814 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
815 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
816 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
817 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
818 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
819 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
820 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
821 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
822 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
823 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
824 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
825 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
826 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
827 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
828 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
829 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
830 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
831 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
832 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
833 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
834 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
835 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
836 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
837 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
838 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
839 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
840 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
841 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
843 int i, r;
844 unsigned char buffer[256];
845 DWORD crc = ~0;
847 lseek(fmap->fd, 0, SEEK_SET);
848 while ((r = read(fmap->fd, buffer, sizeof(buffer))) > 0)
850 for (i = 0; i < r; i++) crc = UPDC32(buffer[i], crc);
852 return ~crc;
853 #undef UPDC32
856 static BOOL elf_check_debug_link(const WCHAR* file, struct elf_file_map* fmap, DWORD crc)
858 BOOL ret;
859 if (!elf_map_file(file, fmap)) return FALSE;
860 if (!(ret = crc == calc_crc32(fmap)))
862 WARN("Bad CRC for file %s (got %08x while expecting %08x)\n",
863 debugstr_w(file), calc_crc32(fmap), crc);
864 elf_unmap_file(fmap);
866 return ret;
869 /******************************************************************
870 * elf_locate_debug_link
872 * Locate a filename from a .gnu_debuglink section, using the same
873 * strategy as gdb:
874 * "If the full name of the directory containing the executable is
875 * execdir, and the executable has a debug link that specifies the
876 * name debugfile, then GDB will automatically search for the
877 * debugging information file in three places:
878 * - the directory containing the executable file (that is, it
879 * will look for a file named `execdir/debugfile',
880 * - a subdirectory of that directory named `.debug' (that is, the
881 * file `execdir/.debug/debugfile', and
882 * - a subdirectory of the global debug file directory that includes
883 * the executable's full path, and the name from the link (that is,
884 * the file `globaldebugdir/execdir/debugfile', where globaldebugdir
885 * is the global debug file directory, and execdir has been turned
886 * into a relative path)." (from GDB manual)
888 static BOOL elf_locate_debug_link(struct elf_file_map* fmap, const char* filename,
889 const WCHAR* loaded_file, DWORD crc)
891 static const WCHAR globalDebugDirW[] = {'/','u','s','r','/','l','i','b','/','d','e','b','u','g','/'};
892 static const WCHAR dotDebugW[] = {'.','d','e','b','u','g','/'};
893 const size_t globalDebugDirLen = sizeof(globalDebugDirW) / sizeof(WCHAR);
894 size_t filename_len;
895 WCHAR* p = NULL;
896 WCHAR* slash;
897 struct elf_file_map* fmap_link = NULL;
899 fmap_link = HeapAlloc(GetProcessHeap(), 0, sizeof(*fmap_link));
900 if (!fmap_link) return FALSE;
902 filename_len = MultiByteToWideChar(CP_UNIXCP, 0, filename, -1, NULL, 0);
903 p = HeapAlloc(GetProcessHeap(), 0,
904 (globalDebugDirLen + strlenW(loaded_file) + 6 + 1 + filename_len + 1) * sizeof(WCHAR));
905 if (!p) goto found;
907 /* we prebuild the string with "execdir" */
908 strcpyW(p, loaded_file);
909 slash = strrchrW(p, '/');
910 if (slash == NULL) slash = p; else slash++;
912 /* testing execdir/filename */
913 MultiByteToWideChar(CP_UNIXCP, 0, filename, -1, slash, filename_len);
914 if (elf_check_debug_link(p, fmap_link, crc)) goto found;
916 /* testing execdir/.debug/filename */
917 memcpy(slash, dotDebugW, sizeof(dotDebugW));
918 MultiByteToWideChar(CP_UNIXCP, 0, filename, -1, slash + sizeof(dotDebugW) / sizeof(WCHAR), filename_len);
919 if (elf_check_debug_link(p, fmap_link, crc)) goto found;
921 /* testing globaldebugdir/execdir/filename */
922 memmove(p + globalDebugDirLen, p, (slash - p) * sizeof(WCHAR));
923 memcpy(p, globalDebugDirW, globalDebugDirLen * sizeof(WCHAR));
924 slash += globalDebugDirLen;
925 MultiByteToWideChar(CP_UNIXCP, 0, filename, -1, slash, filename_len);
926 if (elf_check_debug_link(p, fmap_link, crc)) goto found;
928 /* finally testing filename */
929 if (elf_check_debug_link(slash, fmap_link, crc)) goto found;
932 WARN("Couldn't locate or map %s\n", filename);
933 HeapFree(GetProcessHeap(), 0, p);
934 HeapFree(GetProcessHeap(), 0, fmap_link);
935 return FALSE;
937 found:
938 TRACE("Located debug information file %s at %s\n", filename, debugstr_w(p));
939 HeapFree(GetProcessHeap(), 0, p);
940 fmap->alternate = fmap_link;
941 return TRUE;
944 /******************************************************************
945 * elf_debuglink_parse
947 * Parses a .gnu_debuglink section and loads the debug info from
948 * the external file specified there.
950 static BOOL elf_debuglink_parse(struct elf_file_map* fmap, struct module* module,
951 const BYTE* debuglink)
953 /* The content of a debug link section is:
954 * 1/ a NULL terminated string, containing the file name for the
955 * debug info
956 * 2/ padding on 4 byte boundary
957 * 3/ CRC of the linked ELF file
959 const char* dbg_link = (char*)debuglink;
960 DWORD crc;
962 crc = *(const DWORD*)(dbg_link + ((DWORD_PTR)(strlen(dbg_link) + 4) & ~3));
963 return elf_locate_debug_link(fmap, dbg_link, module->module.LoadedImageName, crc);
966 /******************************************************************
967 * elf_load_debug_info_from_map
969 * Loads the symbolic information from ELF module which mapping is described
970 * in fmap
971 * the module has been loaded at 'load_offset' address, so symbols' address
972 * relocation is performed.
973 * CRC is checked if fmap->with_crc is TRUE
974 * returns
975 * 0 if the file doesn't contain symbolic info (or this info cannot be
976 * read or parsed)
977 * 1 on success
979 static BOOL elf_load_debug_info_from_map(struct module* module,
980 struct elf_file_map* fmap,
981 struct pool* pool,
982 struct hash_table* ht_symtab)
984 BOOL ret = FALSE, lret;
985 struct elf_thunk_area thunks[] =
987 {"__wine_spec_import_thunks", THUNK_ORDINAL_NOTYPE, 0, 0}, /* inter DLL calls */
988 {"__wine_spec_delayed_import_loaders", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
989 {"__wine_spec_delayed_import_thunks", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
990 {"__wine_delay_load", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
991 {"__wine_spec_thunk_text_16", -16, 0, 0}, /* 16 => 32 thunks */
992 {"__wine_spec_thunk_text_32", -32, 0, 0}, /* 32 => 16 thunks */
993 {NULL, 0, 0, 0}
996 module->module.SymType = SymExport;
998 /* create a hash table for the symtab */
999 elf_hash_symtab(module, pool, ht_symtab, fmap, thunks);
1001 if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
1003 struct elf_section_map stab_sect, stabstr_sect;
1004 struct elf_section_map debug_sect, debug_str_sect, debug_abbrev_sect,
1005 debug_line_sect, debug_loclist_sect;
1006 struct elf_section_map debuglink_sect;
1008 /* if present, add the .gnu_debuglink file as an alternate to current one */
1009 if (elf_find_section(fmap, ".gnu_debuglink", SHT_NULL, &debuglink_sect))
1011 const BYTE* dbg_link;
1013 dbg_link = (const BYTE*)elf_map_section(&debuglink_sect);
1014 if (dbg_link != ELF_NO_MAP)
1016 lret = elf_debuglink_parse(fmap, module, dbg_link);
1017 if (!lret)
1018 WARN("Couldn't load linked debug file for %s\n",
1019 debugstr_w(module->module.ModuleName));
1020 ret = ret || lret;
1022 elf_unmap_section(&debuglink_sect);
1024 if (elf_find_section(fmap, ".stab", SHT_NULL, &stab_sect) &&
1025 elf_find_section(fmap, ".stabstr", SHT_NULL, &stabstr_sect))
1027 const char* stab;
1028 const char* stabstr;
1030 stab = elf_map_section(&stab_sect);
1031 stabstr = elf_map_section(&stabstr_sect);
1032 if (stab != ELF_NO_MAP && stabstr != ELF_NO_MAP)
1034 /* OK, now just parse all of the stabs. */
1035 lret = stabs_parse(module, module->elf_info->elf_addr,
1036 stab, elf_get_map_size(&stab_sect),
1037 stabstr, elf_get_map_size(&stabstr_sect));
1038 if (lret)
1039 /* and fill in the missing information for stabs */
1040 elf_finish_stabs_info(module, ht_symtab);
1041 else
1042 WARN("Couldn't correctly read stabs\n");
1043 ret = ret || lret;
1045 else lret = FALSE;
1046 elf_unmap_section(&stab_sect);
1047 elf_unmap_section(&stabstr_sect);
1049 if (elf_find_section(fmap, ".debug_info", SHT_NULL, &debug_sect))
1051 /* Dwarf 2 debug information */
1052 const BYTE* dw2_debug;
1053 const BYTE* dw2_debug_abbrev;
1054 const BYTE* dw2_debug_str;
1055 const BYTE* dw2_debug_line;
1056 const BYTE* dw2_debug_loclist;
1058 TRACE("Loading Dwarf2 information for %s\n", module->module_name);
1060 elf_find_section(fmap, ".debug_str", SHT_NULL, &debug_str_sect);
1061 elf_find_section(fmap, ".debug_abbrev", SHT_NULL, &debug_abbrev_sect);
1062 elf_find_section(fmap, ".debug_line", SHT_NULL, &debug_line_sect);
1063 elf_find_section(fmap, ".debug_loc", SHT_NULL, &debug_loclist_sect);
1065 dw2_debug = (const BYTE*)elf_map_section(&debug_sect);
1066 dw2_debug_abbrev = (const BYTE*)elf_map_section(&debug_abbrev_sect);
1067 dw2_debug_str = (const BYTE*)elf_map_section(&debug_str_sect);
1068 dw2_debug_line = (const BYTE*)elf_map_section(&debug_line_sect);
1069 dw2_debug_loclist = (const BYTE*)elf_map_section(&debug_loclist_sect);
1070 if (dw2_debug != ELF_NO_MAP && dw2_debug_abbrev != ELF_NO_MAP && dw2_debug_str != ELF_NO_MAP)
1072 /* OK, now just parse dwarf2 debug infos. */
1073 lret = dwarf2_parse(module, module->elf_info->elf_addr, thunks,
1074 dw2_debug, elf_get_map_size(&debug_sect),
1075 dw2_debug_abbrev, elf_get_map_size(&debug_abbrev_sect),
1076 dw2_debug_str, elf_get_map_size(&debug_str_sect),
1077 dw2_debug_line, elf_get_map_size(&debug_line_sect),
1078 dw2_debug_loclist, elf_get_map_size(&debug_loclist_sect));
1080 if (!lret)
1081 WARN("Couldn't correctly read stabs\n");
1082 ret = ret || lret;
1084 elf_unmap_section(&debug_sect);
1085 elf_unmap_section(&debug_abbrev_sect);
1086 elf_unmap_section(&debug_str_sect);
1087 elf_unmap_section(&debug_line_sect);
1088 elf_unmap_section(&debug_loclist_sect);
1091 if (strstrW(module->module.ModuleName, S_ElfW) ||
1092 !strcmpW(module->module.ModuleName, S_WineLoaderW))
1094 /* add the thunks for native libraries */
1095 if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
1096 elf_new_wine_thunks(module, ht_symtab, thunks);
1098 /* add all the public symbols from symtab */
1099 if (elf_new_public_symbols(module, ht_symtab) && !ret) ret = TRUE;
1101 return ret;
1104 /******************************************************************
1105 * elf_load_debug_info
1107 * Loads ELF debugging information from the module image file.
1109 BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
1111 BOOL ret = TRUE;
1112 struct pool pool;
1113 struct hash_table ht_symtab;
1114 struct elf_file_map my_fmap;
1116 if (module->type != DMT_ELF || !module->elf_info)
1118 ERR("Bad elf module '%s'\n", debugstr_w(module->module.LoadedImageName));
1119 return FALSE;
1122 pool_init(&pool, 65536);
1123 hash_table_init(&pool, &ht_symtab, 256);
1125 if (!fmap)
1127 fmap = &my_fmap;
1128 ret = elf_map_file(module->module.LoadedImageName, fmap);
1130 if (ret)
1131 ret = elf_load_debug_info_from_map(module, fmap, &pool, &ht_symtab);
1133 pool_destroy(&pool);
1134 if (fmap == &my_fmap) elf_unmap_file(fmap);
1135 return ret;
1138 /******************************************************************
1139 * elf_fetch_file_info
1141 * Gathers some more information for an ELF module from a given file
1143 BOOL elf_fetch_file_info(const WCHAR* name, DWORD* base,
1144 DWORD* size, DWORD* checksum)
1146 struct elf_file_map fmap;
1148 if (!elf_map_file(name, &fmap)) return FALSE;
1149 if (base) *base = fmap.elf_start;
1150 *size = fmap.elf_size;
1151 *checksum = calc_crc32(&fmap);
1152 elf_unmap_file(&fmap);
1153 return TRUE;
1156 /******************************************************************
1157 * elf_load_file
1159 * Loads the information for ELF module stored in 'filename'
1160 * the module has been loaded at 'load_offset' address
1161 * returns
1162 * -1 if the file cannot be found/opened
1163 * 0 if the file doesn't contain symbolic info (or this info cannot be
1164 * read or parsed)
1165 * 1 on success
1167 static BOOL elf_load_file(struct process* pcs, const WCHAR* filename,
1168 unsigned long load_offset, struct elf_info* elf_info)
1170 BOOL ret = FALSE;
1171 struct elf_file_map fmap;
1173 TRACE("Processing elf file '%s' at %08lx\n", debugstr_w(filename), load_offset);
1175 if (!elf_map_file(filename, &fmap)) goto leave;
1177 /* Next, we need to find a few of the internal ELF headers within
1178 * this thing. We need the main executable header, and the section
1179 * table.
1181 if (!fmap.elf_start && !load_offset)
1182 ERR("Relocatable ELF %s, but no load address. Loading at 0x0000000\n",
1183 debugstr_w(filename));
1184 if (fmap.elf_start && load_offset)
1186 WARN("Non-relocatable ELF %s, but load address of 0x%08lx supplied. "
1187 "Assuming load address is corrupt\n", debugstr_w(filename), load_offset);
1188 load_offset = 0;
1191 if (elf_info->flags & ELF_INFO_DEBUG_HEADER)
1193 struct elf_section_map esm;
1195 if (elf_find_section(&fmap, ".dynamic", SHT_DYNAMIC, &esm))
1197 Elf32_Dyn dyn;
1198 char* ptr = (char*)fmap.sect[esm.sidx].shdr.sh_addr;
1199 unsigned long len;
1203 if (!ReadProcessMemory(pcs->handle, ptr, &dyn, sizeof(dyn), &len) ||
1204 len != sizeof(dyn))
1205 goto leave;
1206 if (dyn.d_tag == DT_DEBUG)
1208 elf_info->dbg_hdr_addr = dyn.d_un.d_ptr;
1209 break;
1211 ptr += sizeof(dyn);
1212 } while (dyn.d_tag != DT_NULL);
1213 if (dyn.d_tag == DT_NULL) goto leave;
1215 elf_end_find(&fmap);
1218 if (elf_info->flags & ELF_INFO_MODULE)
1220 struct elf_module_info *elf_module_info =
1221 HeapAlloc(GetProcessHeap(), 0, sizeof(struct elf_module_info));
1222 if (!elf_module_info) goto leave;
1223 elf_info->module = module_new(pcs, filename, DMT_ELF, FALSE,
1224 (load_offset) ? load_offset : fmap.elf_start,
1225 fmap.elf_size, 0, calc_crc32(&fmap));
1226 if (!elf_info->module)
1228 HeapFree(GetProcessHeap(), 0, elf_module_info);
1229 goto leave;
1231 elf_info->module->elf_info = elf_module_info;
1232 elf_info->module->elf_info->elf_addr = load_offset;
1234 if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
1236 elf_info->module->module.SymType = SymDeferred;
1237 ret = TRUE;
1239 else ret = elf_load_debug_info(elf_info->module, &fmap);
1241 elf_info->module->elf_info->elf_mark = 1;
1242 elf_info->module->elf_info->elf_loader = 0;
1243 } else ret = TRUE;
1245 if (elf_info->flags & ELF_INFO_NAME)
1247 WCHAR* ptr;
1248 ptr = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(filename) + 1) * sizeof(WCHAR));
1249 if (ptr)
1251 strcpyW(ptr, filename);
1252 elf_info->module_name = ptr;
1254 else ret = FALSE;
1256 leave:
1257 elf_unmap_file(&fmap);
1259 return ret;
1262 /******************************************************************
1263 * elf_load_file_from_path
1264 * tries to load an ELF file from a set of paths (separated by ':')
1266 static BOOL elf_load_file_from_path(HANDLE hProcess,
1267 const WCHAR* filename,
1268 unsigned long load_offset,
1269 const char* path,
1270 struct elf_info* elf_info)
1272 BOOL ret = FALSE;
1273 WCHAR *s, *t, *fn;
1274 WCHAR* pathW = NULL;
1275 unsigned len;
1277 if (!path) return FALSE;
1279 len = MultiByteToWideChar(CP_UNIXCP, 0, path, -1, NULL, 0);
1280 pathW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
1281 if (!pathW) return FALSE;
1282 MultiByteToWideChar(CP_UNIXCP, 0, path, -1, pathW, len);
1284 for (s = pathW; s && *s; s = (t) ? (t+1) : NULL)
1286 t = strchrW(s, ':');
1287 if (t) *t = '\0';
1288 fn = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(filename) + 1 + lstrlenW(s) + 1) * sizeof(WCHAR));
1289 if (!fn) break;
1290 strcpyW(fn, s);
1291 strcatW(fn, S_SlashW);
1292 strcatW(fn, filename);
1293 ret = elf_load_file(hProcess, fn, load_offset, elf_info);
1294 HeapFree(GetProcessHeap(), 0, fn);
1295 if (ret) break;
1296 s = (t) ? (t+1) : NULL;
1299 HeapFree(GetProcessHeap(), 0, pathW);
1300 return ret;
1303 /******************************************************************
1304 * elf_load_file_from_dll_path
1306 * Tries to load an ELF file from the dll path
1308 static BOOL elf_load_file_from_dll_path(HANDLE hProcess,
1309 const WCHAR* filename,
1310 unsigned long load_offset,
1311 struct elf_info* elf_info)
1313 BOOL ret = FALSE;
1314 unsigned int index = 0;
1315 const char *path;
1317 while (!ret && (path = wine_dll_enum_load_path( index++ )))
1319 WCHAR *name;
1320 unsigned len;
1322 len = MultiByteToWideChar(CP_UNIXCP, 0, path, -1, NULL, 0);
1324 name = HeapAlloc( GetProcessHeap(), 0,
1325 (len + lstrlenW(filename) + 2) * sizeof(WCHAR) );
1327 if (!name) break;
1328 MultiByteToWideChar(CP_UNIXCP, 0, path, -1, name, len);
1329 strcatW( name, S_SlashW );
1330 strcatW( name, filename );
1331 ret = elf_load_file(hProcess, name, load_offset, elf_info);
1332 HeapFree( GetProcessHeap(), 0, name );
1334 return ret;
1337 /******************************************************************
1338 * elf_search_and_load_file
1340 * lookup a file in standard ELF locations, and if found, load it
1342 static BOOL elf_search_and_load_file(struct process* pcs, const WCHAR* filename,
1343 unsigned long load_offset,
1344 struct elf_info* elf_info)
1346 BOOL ret = FALSE;
1347 struct module* module;
1348 static WCHAR S_libstdcPPW[] = {'l','i','b','s','t','d','c','+','+','\0'};
1350 if (filename == NULL || *filename == '\0') return FALSE;
1351 if ((module = module_find_by_name(pcs, filename, DMT_ELF)))
1353 elf_info->module = module;
1354 module->elf_info->elf_mark = 1;
1355 return module->module.SymType;
1358 if (strstrW(filename, S_libstdcPPW)) return FALSE; /* We know we can't do it */
1359 ret = elf_load_file(pcs, filename, load_offset, elf_info);
1360 /* if relative pathname, try some absolute base dirs */
1361 if (!ret && !strchrW(filename, '/'))
1363 ret = elf_load_file_from_path(pcs, filename, load_offset,
1364 getenv("PATH"), elf_info) ||
1365 elf_load_file_from_path(pcs, filename, load_offset,
1366 getenv("LD_LIBRARY_PATH"), elf_info);
1367 if (!ret) ret = elf_load_file_from_dll_path(pcs, filename, load_offset, elf_info);
1370 return ret;
1373 /******************************************************************
1374 * elf_enum_modules_internal
1376 * Enumerate ELF modules from a running process
1378 static BOOL elf_enum_modules_internal(const struct process* pcs,
1379 const WCHAR* main_name,
1380 elf_enum_modules_cb cb, void* user)
1382 struct r_debug dbg_hdr;
1383 void* lm_addr;
1384 struct link_map lm;
1385 char bufstr[256];
1386 WCHAR bufstrW[MAX_PATH];
1388 if (!pcs->dbg_hdr_addr ||
1389 !ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr,
1390 &dbg_hdr, sizeof(dbg_hdr), NULL))
1391 return FALSE;
1393 /* Now walk the linked list. In all known ELF implementations,
1394 * the dynamic loader maintains this linked list for us. In some
1395 * cases the first entry doesn't appear with a name, in other cases it
1396 * does.
1398 for (lm_addr = (void*)dbg_hdr.r_map; lm_addr; lm_addr = (void*)lm.l_next)
1400 if (!ReadProcessMemory(pcs->handle, lm_addr, &lm, sizeof(lm), NULL))
1401 return FALSE;
1403 if (lm.l_prev != NULL && /* skip first entry, normally debuggee itself */
1404 lm.l_name != NULL &&
1405 ReadProcessMemory(pcs->handle, lm.l_name, bufstr, sizeof(bufstr), NULL))
1407 bufstr[sizeof(bufstr) - 1] = '\0';
1408 MultiByteToWideChar(CP_UNIXCP, 0, bufstr, -1, bufstrW, sizeof(bufstrW) / sizeof(WCHAR));
1409 if (main_name && !bufstrW[0]) strcpyW(bufstrW, main_name);
1410 if (!cb(bufstrW, (unsigned long)lm.l_addr, user)) break;
1413 return TRUE;
1416 struct elf_sync
1418 struct process* pcs;
1419 struct elf_info elf_info;
1422 static BOOL elf_enum_sync_cb(const WCHAR* name, unsigned long addr, void* user)
1424 struct elf_sync* es = user;
1426 elf_search_and_load_file(es->pcs, name, addr, &es->elf_info);
1427 return TRUE;
1430 /******************************************************************
1431 * elf_synchronize_module_list
1433 * this functions rescans the debuggee module's list and synchronizes it with
1434 * the one from 'pcs', ie:
1435 * - if a module is in debuggee and not in pcs, it's loaded into pcs
1436 * - if a module is in pcs and not in debuggee, it's unloaded from pcs
1438 BOOL elf_synchronize_module_list(struct process* pcs)
1440 struct module* module;
1441 struct elf_sync es;
1443 for (module = pcs->lmodules; module; module = module->next)
1445 if (module->type == DMT_ELF && !module->is_virtual)
1446 module->elf_info->elf_mark = 0;
1449 es.pcs = pcs;
1450 es.elf_info.flags = ELF_INFO_MODULE;
1451 if (!elf_enum_modules_internal(pcs, NULL, elf_enum_sync_cb, &es))
1452 return FALSE;
1454 module = pcs->lmodules;
1455 while (module)
1457 if (module->type == DMT_ELF && !module->is_virtual &&
1458 !module->elf_info->elf_mark && !module->elf_info->elf_loader)
1460 module_remove(pcs, module);
1461 /* restart all over */
1462 module = pcs->lmodules;
1464 else module = module->next;
1466 return TRUE;
1469 /******************************************************************
1470 * elf_search_loader
1472 * Lookup in a running ELF process the loader, and sets its ELF link
1473 * address (for accessing the list of loaded .so libs) in pcs.
1474 * If flags is ELF_INFO_MODULE, the module for the loader is also
1475 * added as a module into pcs.
1477 static BOOL elf_search_loader(struct process* pcs, struct elf_info* elf_info)
1479 BOOL ret;
1480 const char* ptr;
1482 /* All binaries are loaded with WINELOADER (if run from tree) or by the
1483 * main executable (either wine-kthread or wine-pthread)
1484 * FIXME: the heuristic used to know whether we need to load wine-pthread
1485 * or wine-kthread is not 100% safe
1487 if ((ptr = getenv("WINELOADER")))
1489 WCHAR tmp[MAX_PATH];
1490 MultiByteToWideChar(CP_ACP, 0, ptr, -1, tmp, sizeof(tmp) / sizeof(WCHAR));
1491 ret = elf_search_and_load_file(pcs, tmp, 0, elf_info);
1493 else
1495 ret = elf_search_and_load_file(pcs, S_WineKThreadW, 0, elf_info) ||
1496 elf_search_and_load_file(pcs, S_WinePThreadW, 0, elf_info);
1498 return ret;
1501 /******************************************************************
1502 * elf_read_wine_loader_dbg_info
1504 * Try to find a decent wine executable which could have loaded the debuggee
1506 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1508 struct elf_info elf_info;
1510 elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_MODULE;
1511 if (!elf_search_loader(pcs, &elf_info)) return FALSE;
1512 elf_info.module->elf_info->elf_loader = 1;
1513 module_set_module(elf_info.module, S_WineLoaderW);
1514 return (pcs->dbg_hdr_addr = elf_info.dbg_hdr_addr) != 0;
1517 /******************************************************************
1518 * elf_enum_modules
1520 * Enumerates the ELF loaded modules from a running target (hProc)
1521 * This function doesn't require that someone has called SymInitialize
1522 * on this very process.
1524 BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb cb, void* user)
1526 struct process pcs;
1527 struct elf_info elf_info;
1528 BOOL ret;
1530 memset(&pcs, 0, sizeof(pcs));
1531 pcs.handle = hProc;
1532 elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_NAME;
1533 if (!elf_search_loader(&pcs, &elf_info)) return FALSE;
1534 pcs.dbg_hdr_addr = elf_info.dbg_hdr_addr;
1535 ret = elf_enum_modules_internal(&pcs, elf_info.module_name, cb, user);
1536 HeapFree(GetProcessHeap(), 0, (char*)elf_info.module_name);
1537 return ret;
1540 struct elf_load
1542 struct process* pcs;
1543 struct elf_info elf_info;
1544 const WCHAR* name;
1545 BOOL ret;
1548 /******************************************************************
1549 * elf_load_cb
1551 * Callback for elf_load_module, used to walk the list of loaded
1552 * modules.
1554 static BOOL elf_load_cb(const WCHAR* name, unsigned long addr, void* user)
1556 struct elf_load* el = user;
1557 const WCHAR* p;
1559 /* memcmp is needed for matches when bufstr contains also version information
1560 * el->name: libc.so, name: libc.so.6.0
1562 p = strrchrW(name, '/');
1563 if (!p++) p = name;
1564 if (!memcmp(p, el->name, lstrlenW(el->name) * sizeof(WCHAR)))
1566 el->ret = elf_search_and_load_file(el->pcs, name, addr, &el->elf_info);
1567 return FALSE;
1569 return TRUE;
1572 /******************************************************************
1573 * elf_load_module
1575 * loads an ELF module and stores it in process' module list
1576 * Also, find module real name and load address from
1577 * the real loaded modules list in pcs address space
1579 struct module* elf_load_module(struct process* pcs, const WCHAR* name, unsigned long addr)
1581 struct elf_load el;
1583 TRACE("(%p %s %08lx)\n", pcs, debugstr_w(name), addr);
1585 el.elf_info.flags = ELF_INFO_MODULE;
1586 el.ret = FALSE;
1588 if (pcs->dbg_hdr_addr) /* we're debugging a life target */
1590 el.pcs = pcs;
1591 /* do only the lookup from the filename, not the path (as we lookup module
1592 * name in the process' loaded module list)
1594 el.name = strrchrW(name, '/');
1595 if (!el.name++) el.name = name;
1596 el.ret = FALSE;
1598 if (!elf_enum_modules_internal(pcs, NULL, elf_load_cb, &el))
1599 return NULL;
1601 else if (addr)
1603 el.name = name;
1604 el.ret = elf_search_and_load_file(pcs, el.name, addr, &el.elf_info);
1606 if (!el.ret) return NULL;
1607 assert(el.elf_info.module);
1608 return el.elf_info.module;
1611 #else /* !__ELF__ */
1613 BOOL elf_synchronize_module_list(struct process* pcs)
1615 return FALSE;
1618 BOOL elf_fetch_file_info(const WCHAR* name, DWORD* base,
1619 DWORD* size, DWORD* checksum)
1621 return FALSE;
1624 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1626 return FALSE;
1629 BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb cb, void* user)
1631 return FALSE;
1634 struct module* elf_load_module(struct process* pcs, const WCHAR* name, unsigned long addr)
1636 return NULL;
1639 BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
1641 return FALSE;
1644 int elf_is_in_thunk_area(unsigned long addr,
1645 const struct elf_thunk_area* thunks)
1647 return -1;
1649 #endif /* __ELF__ */