dbghelp: Virtual modules.
[wine/wine64.git] / dlls / dbghelp / elf_module.c
blobad1a4ffb8d0947507bc46a66aa2419446bb95bed
1 /*
2 * File elf.c - processing of ELF files
4 * Copyright (C) 1996, Eric Youngdale.
5 * 1999-2004 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "config.h"
23 #include "wine/port.h"
25 #include <assert.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28 #ifdef HAVE_SYS_STAT_H
29 # include <sys/stat.h>
30 #endif
31 #include <fcntl.h>
32 #ifdef HAVE_SYS_MMAN_H
33 #include <sys/mman.h>
34 #endif
35 #ifdef HAVE_UNISTD_H
36 # include <unistd.h>
37 #endif
38 #ifndef PATH_MAX
39 #define PATH_MAX MAX_PATH
40 #endif
42 #include "dbghelp_private.h"
44 #if defined(__svr4__) || defined(__sun)
45 #define __ELF__
46 #endif
48 #ifdef HAVE_ELF_H
49 # include <elf.h>
50 #endif
51 #ifdef HAVE_SYS_ELF32_H
52 # include <sys/elf32.h>
53 #endif
54 #ifdef HAVE_SYS_EXEC_ELF_H
55 # include <sys/exec_elf.h>
56 #endif
57 #if !defined(DT_NUM)
58 # if defined(DT_COUNT)
59 # define DT_NUM DT_COUNT
60 # else
61 /* this seems to be a satisfactory value on Solaris, which doesn't support this AFAICT */
62 # define DT_NUM 24
63 # endif
64 #endif
65 #ifdef HAVE_LINK_H
66 # include <link.h>
67 #endif
68 #ifdef HAVE_SYS_LINK_H
69 # include <sys/link.h>
70 #endif
72 #include "wine/library.h"
73 #include "wine/debug.h"
75 WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
77 struct elf_module_info
79 unsigned long elf_addr;
80 unsigned short elf_mark : 1,
81 elf_loader : 1;
84 #ifdef __ELF__
86 #define ELF_INFO_DEBUG_HEADER 0x0001
87 #define ELF_INFO_MODULE 0x0002
88 #define ELF_INFO_NAME 0x0004
90 struct elf_info
92 unsigned flags; /* IN one (or several) of the ELF_INFO constants */
93 unsigned long dbg_hdr_addr; /* OUT address of debug header (if ELF_INFO_DEBUG_HEADER is set) */
94 struct module* module; /* OUT loaded module (if ELF_INFO_MODULE is set) */
95 const char* module_name; /* OUT found module name (if ELF_INFO_NAME is set) */
98 #define NO_MAP ((const void*)0xffffffff)
99 /* structure holding information while handling an ELF image
100 * allows one by one section mapping for memory savings
102 struct elf_file_map
104 Elf32_Ehdr elfhdr;
105 size_t elf_size;
106 size_t elf_start;
107 struct
109 Elf32_Shdr shdr;
110 const char* mapped;
111 }* sect;
112 int fd;
113 unsigned with_crc;
114 unsigned long crc;
117 struct symtab_elt
119 struct hash_table_elt ht_elt;
120 const Elf32_Sym* symp;
121 const char* filename;
122 unsigned used;
125 struct thunk_area
127 const char* symname;
128 THUNK_ORDINAL ordinal;
129 unsigned long rva_start;
130 unsigned long rva_end;
133 /******************************************************************
134 * elf_map_section
136 * Maps a single section into memory from an ELF file
138 static const char* elf_map_section(struct elf_file_map* fmap, int sidx)
140 unsigned pgsz = getpagesize();
141 unsigned ofst, size;
143 if (sidx >= fmap->elfhdr.e_shnum ||
144 fmap->sect[sidx].shdr.sh_type == SHT_NOBITS)
145 return NO_MAP;
146 /* align required information on page size (we assume pagesize is a power of 2) */
147 ofst = fmap->sect[sidx].shdr.sh_offset & ~(pgsz - 1);
148 size = (fmap->sect[sidx].shdr.sh_offset +
149 fmap->sect[sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1);
150 fmap->sect[sidx].mapped = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fmap->fd, ofst);
151 if (fmap->sect[sidx].mapped == NO_MAP) return NO_MAP;
152 return fmap->sect[sidx].mapped + (fmap->sect[sidx].shdr.sh_offset & (pgsz - 1));
155 /******************************************************************
156 * elf_unmap_section
158 * Unmaps a single section from memory
160 static void elf_unmap_section(struct elf_file_map* fmap, int sidx)
162 if (sidx < fmap->elfhdr.e_shnum && fmap->sect[sidx].mapped != NO_MAP)
164 munmap((char*)fmap->sect[sidx].mapped, fmap->sect[sidx].shdr.sh_size);
165 fmap->sect[sidx].mapped = NO_MAP;
169 /******************************************************************
170 * elf_map_file
172 * Maps an ELF file into memory (and checks it's a real ELF file)
174 static BOOL elf_map_file(const char* filename, struct elf_file_map* fmap)
176 static const BYTE elf_signature[4] = { ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3 };
177 struct stat statbuf;
178 int i;
179 Elf32_Phdr phdr;
180 unsigned tmp, page_mask = getpagesize() - 1;
183 fmap->fd = -1;
184 fmap->with_crc = 0;
186 /* check that the file exists, and that the module hasn't been loaded yet */
187 if (stat(filename, &statbuf) == -1 || S_ISDIR(statbuf.st_mode)) return FALSE;
189 /* Now open the file, so that we can mmap() it. */
190 if ((fmap->fd = open(filename, O_RDONLY)) == -1) return FALSE;
192 if (read(fmap->fd, &fmap->elfhdr, sizeof(fmap->elfhdr)) != sizeof(fmap->elfhdr))
193 return FALSE;
194 /* and check for an ELF header */
195 if (memcmp(fmap->elfhdr.e_ident,
196 elf_signature, sizeof(elf_signature))) return FALSE;
198 fmap->sect = HeapAlloc(GetProcessHeap(), 0,
199 fmap->elfhdr.e_shnum * sizeof(fmap->sect[0]));
200 if (!fmap->sect) return FALSE;
202 lseek(fmap->fd, fmap->elfhdr.e_shoff, SEEK_SET);
203 for (i = 0; i < fmap->elfhdr.e_shnum; i++)
205 read(fmap->fd, &fmap->sect[i].shdr, sizeof(fmap->sect[i].shdr));
206 fmap->sect[i].mapped = NO_MAP;
209 /* grab size of module once loaded in memory */
210 lseek(fmap->fd, fmap->elfhdr.e_phoff, SEEK_SET);
211 fmap->elf_size = 0;
212 fmap->elf_start = ~0L;
213 for (i = 0; i < fmap->elfhdr.e_phnum; i++)
215 if (read(fmap->fd, &phdr, sizeof(phdr)) == sizeof(phdr) &&
216 phdr.p_type == PT_LOAD)
218 tmp = (phdr.p_vaddr + phdr.p_memsz + page_mask) & ~page_mask;
219 if (fmap->elf_size < tmp) fmap->elf_size = tmp;
220 if (phdr.p_vaddr < fmap->elf_start) fmap->elf_start = phdr.p_vaddr;
223 /* if non relocatable ELF, then remove fixed address from computation
224 * otherwise, all addresses are zero based and start has no effect
226 fmap->elf_size -= fmap->elf_start;
227 return TRUE;
230 /******************************************************************
231 * elf_unmap_file
233 * Unmaps an ELF file from memory (previously mapped with elf_map_file)
235 static void elf_unmap_file(struct elf_file_map* fmap)
237 if (fmap->fd != -1)
239 int i;
240 for (i = 0; i < fmap->elfhdr.e_shnum; i++)
242 elf_unmap_section(fmap, i);
244 HeapFree(GetProcessHeap(), 0, fmap->sect);
245 close(fmap->fd);
249 /******************************************************************
250 * elf_hash_symtab
252 * creating an internal hash table to ease use ELF symtab information lookup
254 static void elf_hash_symtab(const struct module* module, struct pool* pool,
255 struct hash_table* ht_symtab, struct elf_file_map* fmap,
256 int symtab_idx, struct thunk_area* thunks)
258 int i, j, nsym;
259 const char* strp;
260 const char* symname;
261 const char* filename = NULL;
262 const char* ptr;
263 const Elf32_Sym* symp;
264 struct symtab_elt* ste;
266 symp = (const Elf32_Sym*)elf_map_section(fmap, symtab_idx);
267 strp = elf_map_section(fmap, fmap->sect[symtab_idx].shdr.sh_link);
268 if (symp == NO_MAP || strp == NO_MAP) return;
270 nsym = fmap->sect[symtab_idx].shdr.sh_size / sizeof(*symp);
272 for (j = 0; thunks[j].symname; j++)
273 thunks[j].rva_start = thunks[j].rva_end = 0;
275 for (i = 0; i < nsym; i++, symp++)
277 /* Ignore certain types of entries which really aren't of that much
278 * interest.
280 if ((ELF32_ST_TYPE(symp->st_info) != STT_FILE &&
281 ELF32_ST_TYPE(symp->st_info) != STT_OBJECT &&
282 ELF32_ST_TYPE(symp->st_info) != STT_FUNC) ||
283 symp->st_shndx == SHN_UNDEF)
285 continue;
288 symname = strp + symp->st_name;
290 if (ELF32_ST_TYPE(symp->st_info) == STT_FILE)
292 filename = symname;
293 continue;
295 for (j = 0; thunks[j].symname; j++)
297 if (!strcmp(symname, thunks[j].symname))
299 thunks[j].rva_start = symp->st_value;
300 thunks[j].rva_end = symp->st_value + symp->st_size;
301 break;
304 if (thunks[j].symname) continue;
306 /* FIXME: we don't need to handle them (GCC internals)
307 * Moreover, they screw up our symbol lookup :-/
309 if (symname[0] == '.' && symname[1] == 'L' && isdigit(symname[2]))
310 continue;
312 ste = pool_alloc(pool, sizeof(*ste));
313 ste->ht_elt.name = symname;
314 /* GCC emits, in some cases, a .<digit>+ suffix.
315 * This is used for static variable inside functions, so
316 * that we can have several such variables with same name in
317 * the same compilation unit
318 * We simply ignore that suffix when present (we also get rid
319 * of it in stabs parsing)
321 ptr = symname + strlen(symname) - 1;
322 if (isdigit(*ptr))
324 while (isdigit(*ptr) && ptr >= symname) ptr--;
325 if (ptr > symname && *ptr == '.')
327 char* n = pool_alloc(pool, ptr - symname + 1);
328 memcpy(n, symname, ptr - symname + 1);
329 n[ptr - symname] = '\0';
330 ste->ht_elt.name = n;
333 ste->symp = symp;
334 ste->filename = filename;
335 ste->used = 0;
336 hash_table_add(ht_symtab, &ste->ht_elt);
338 /* as we added in the ht_symtab pointers to the symbols themselves,
339 * we cannot unmap yet the sections, it will be done when we're over
340 * with this ELF file
344 /******************************************************************
345 * elf_lookup_symtab
347 * lookup a symbol by name in our internal hash table for the symtab
349 static const Elf32_Sym* elf_lookup_symtab(const struct module* module,
350 const struct hash_table* ht_symtab,
351 const char* name, struct symt* compiland)
353 struct symtab_elt* weak_result = NULL; /* without compiland name */
354 struct symtab_elt* result = NULL;
355 struct hash_table_iter hti;
356 struct symtab_elt* ste;
357 const char* compiland_name;
358 const char* compiland_basename;
359 const char* base;
361 /* we need weak match up (at least) when symbols of same name,
362 * defined several times in different compilation units,
363 * are merged in a single one (hence a different filename for c.u.)
365 if (compiland)
367 compiland_name = source_get(module,
368 ((struct symt_compiland*)compiland)->source);
369 compiland_basename = strrchr(compiland_name, '/');
370 if (!compiland_basename++) compiland_basename = compiland_name;
372 else compiland_name = compiland_basename = NULL;
374 hash_table_iter_init(ht_symtab, &hti, name);
375 while ((ste = hash_table_iter_up(&hti)))
377 if (ste->used || strcmp(ste->ht_elt.name, name)) continue;
379 weak_result = ste;
380 if ((ste->filename && !compiland_name) || (!ste->filename && compiland_name))
381 continue;
382 if (ste->filename && compiland_name)
384 if (strcmp(ste->filename, compiland_name))
386 base = strrchr(ste->filename, '/');
387 if (!base++) base = ste->filename;
388 if (strcmp(base, compiland_basename)) continue;
391 if (result)
393 FIXME("Already found symbol %s (%s) in symtab %s @%08x and %s @%08x\n",
394 name, compiland_name, result->filename, result->symp->st_value,
395 ste->filename, ste->symp->st_value);
397 else
399 result = ste;
400 ste->used = 1;
403 if (!result && !(result = weak_result))
405 FIXME("Couldn't find symbol %s!%s in symtab\n",
406 module->module.ModuleName, name);
407 return NULL;
409 return result->symp;
412 /******************************************************************
413 * elf_finish_stabs_info
415 * - get any relevant information (address & size) from the bits we got from the
416 * stabs debugging information
418 static void elf_finish_stabs_info(struct module* module, struct hash_table* symtab)
420 struct hash_table_iter hti;
421 void* ptr;
422 struct symt_ht* sym;
423 const Elf32_Sym* symp;
425 hash_table_iter_init(&module->ht_symbols, &hti, NULL);
426 while ((ptr = hash_table_iter_up(&hti)))
428 sym = GET_ENTRY(ptr, struct symt_ht, hash_elt);
429 switch (sym->symt.tag)
431 case SymTagFunction:
432 if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
433 ((struct symt_function*)sym)->size)
435 break;
437 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name,
438 ((struct symt_function*)sym)->container);
439 if (symp)
441 if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
442 ((struct symt_function*)sym)->address != module->elf_info->elf_addr + symp->st_value)
443 FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
444 sym, module->module.ModuleName, sym->hash_elt.name,
445 ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
446 if (((struct symt_function*)sym)->size && ((struct symt_function*)sym)->size != symp->st_size)
447 FIXME("Changing size for %p/%s!%s from %08lx to %08x\n",
448 sym, module->module.ModuleName, sym->hash_elt.name,
449 ((struct symt_function*)sym)->size, symp->st_size);
451 ((struct symt_function*)sym)->address = module->elf_info->elf_addr +
452 symp->st_value;
453 ((struct symt_function*)sym)->size = symp->st_size;
454 } else FIXME("Couldn't find %s!%s\n", module->module.ModuleName, sym->hash_elt.name);
455 break;
456 case SymTagData:
457 switch (((struct symt_data*)sym)->kind)
459 case DataIsGlobal:
460 case DataIsFileStatic:
461 if (((struct symt_data*)sym)->u.address != module->elf_info->elf_addr)
462 break;
463 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name,
464 ((struct symt_data*)sym)->container);
465 if (symp)
467 if (((struct symt_data*)sym)->u.address != module->elf_info->elf_addr &&
468 ((struct symt_data*)sym)->u.address != module->elf_info->elf_addr + symp->st_value)
469 FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
470 sym, module->module.ModuleName, sym->hash_elt.name,
471 ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
472 ((struct symt_data*)sym)->u.address = module->elf_info->elf_addr +
473 symp->st_value;
474 ((struct symt_data*)sym)->kind = (ELF32_ST_BIND(symp->st_info) == STB_LOCAL) ?
475 DataIsFileStatic : DataIsGlobal;
476 } else FIXME("Couldn't find %s!%s\n", module->module.ModuleName, sym->hash_elt.name);
477 break;
478 default:;
480 break;
481 default:
482 FIXME("Unsupported tag %u\n", sym->symt.tag);
483 break;
486 /* since we may have changed some addresses & sizes, mark the module to be resorted */
487 module->sortlist_valid = FALSE;
490 /******************************************************************
491 * elf_load_wine_thunks
493 * creating the thunk objects for a wine native DLL
495 static int elf_new_wine_thunks(struct module* module, struct hash_table* ht_symtab,
496 unsigned num_areas, struct thunk_area* thunks)
498 int j;
499 struct symt_compiland* compiland = NULL;
500 const char* compiland_name = NULL;
501 struct hash_table_iter hti;
502 struct symtab_elt* ste;
503 DWORD addr;
504 int idx;
506 hash_table_iter_init(ht_symtab, &hti, NULL);
507 while ((ste = hash_table_iter_up(&hti)))
509 if (ste->used) continue;
511 /* FIXME: this is not a good idea anyway... we are creating several
512 * compiland objects for a same compilation unit
513 * We try to cache the last compiland used, but it's not enough
514 * (we should here only create compilands if they are not yet
515 * defined)
517 if (!compiland_name || compiland_name != ste->filename)
518 compiland = symt_new_compiland(module,
519 compiland_name = ste->filename);
521 addr = module->elf_info->elf_addr + ste->symp->st_value;
523 for (j = 0; j < num_areas; j++)
525 if (ste->symp->st_value >= thunks[j].rva_start &&
526 ste->symp->st_value < thunks[j].rva_end)
527 break;
529 if (j < num_areas) /* thunk found */
531 symt_new_thunk(module, compiland, ste->ht_elt.name, thunks[j].ordinal,
532 addr, ste->symp->st_size);
534 else
536 ULONG64 ref_addr;
538 idx = symt_find_nearest(module, addr);
539 if (idx != -1)
540 symt_get_info(&module->addr_sorttab[idx]->symt,
541 TI_GET_ADDRESS, &ref_addr);
542 if (idx == -1 || addr != ref_addr)
544 /* creating public symbols for all the ELF symbols which haven't been
545 * used yet (ie we have no debug information on them)
546 * That's the case, for example, of the .spec.c files
548 switch (ELF32_ST_TYPE(ste->symp->st_info))
550 case STT_FUNC:
551 symt_new_function(module, compiland, ste->ht_elt.name,
552 addr, ste->symp->st_size, NULL);
553 break;
554 case STT_OBJECT:
555 symt_new_global_variable(module, compiland, ste->ht_elt.name,
556 ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL,
557 addr, ste->symp->st_size, NULL);
558 break;
559 default:
560 FIXME("Shouldn't happen\n");
561 break;
563 /* FIXME: this is a hack !!!
564 * we are adding new symbols, but as we're parsing a symbol table
565 * (hopefully without duplicate symbols) we delay rebuilding the sorted
566 * module table until we're done with the symbol table
567 * Otherwise, as we intertwine symbols's add and lookup, performance
568 * is rather bad
570 module->sortlist_valid = TRUE;
572 else if (strcmp(ste->ht_elt.name, module->addr_sorttab[idx]->hash_elt.name))
574 ULONG64 xaddr = 0, xsize = 0;
575 DWORD kind = -1;
577 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_ADDRESS, &xaddr);
578 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_LENGTH, &xsize);
579 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_DATAKIND, &kind);
581 /* If none of symbols has a correct size, we consider they are both markers
582 * Hence, we can silence this warning
583 * Also, we check that we don't have two symbols, one local, the other
584 * global which is legal
586 if ((xsize || ste->symp->st_size) &&
587 (kind == (ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL) ? DataIsFileStatic : DataIsGlobal))
588 FIXME("Duplicate in %s: %s<%08lx-%08x> %s<%s-%s>\n",
589 module->module.ModuleName,
590 ste->ht_elt.name, addr, ste->symp->st_size,
591 module->addr_sorttab[idx]->hash_elt.name,
592 wine_dbgstr_longlong(xaddr), wine_dbgstr_longlong(xsize));
596 /* see comment above */
597 module->sortlist_valid = FALSE;
598 return TRUE;
601 /******************************************************************
602 * elf_new_public_symbols
604 * Creates a set of public symbols from an ELF symtab
606 static int elf_new_public_symbols(struct module* module, struct hash_table* symtab)
608 struct symt_compiland* compiland = NULL;
609 const char* compiland_name = NULL;
610 struct hash_table_iter hti;
611 struct symtab_elt* ste;
613 if (dbghelp_options & SYMOPT_NO_PUBLICS) return TRUE;
615 /* FIXME: we're missing the ELF entry point here */
617 hash_table_iter_init(symtab, &hti, NULL);
618 while ((ste = hash_table_iter_up(&hti)))
620 /* FIXME: this is not a good idea anyway... we are creating several
621 * compiland objects for a same compilation unit
622 * We try to cache the last compiland used, but it's not enough
623 * (we should here only create compilands if they are not yet
624 * defined)
626 if (!compiland_name || compiland_name != ste->filename)
627 compiland = symt_new_compiland(module,
628 compiland_name = ste->filename);
630 symt_new_public(module, compiland, ste->ht_elt.name,
631 module->elf_info->elf_addr + ste->symp->st_value,
632 ste->symp->st_size, TRUE /* FIXME */,
633 ELF32_ST_TYPE(ste->symp->st_info) == STT_FUNC);
635 return TRUE;
638 /* Copyright (C) 1986 Gary S. Brown. Modified by Robert Shearman. You may use
639 the following calc_crc32 code or tables extracted from it, as desired without
640 restriction. */
642 /**********************************************************************\
643 |* Demonstration program to compute the 32-bit CRC used as the frame *|
644 |* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 *|
645 |* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level *|
646 |* protocol). The 32-bit FCS was added via the Federal Register, *|
647 |* 1 June 1982, p.23798. I presume but don't know for certain that *|
648 |* this polynomial is or will be included in CCITT V.41, which *|
649 |* defines the 16-bit CRC (often called CRC-CCITT) polynomial. FIPS *|
650 |* PUB 78 says that the 32-bit FCS reduces otherwise undetected *|
651 |* errors by a factor of 10^-5 over 16-bit FCS. *|
652 \**********************************************************************/
654 /* First, the polynomial itself and its table of feedback terms. The */
655 /* polynomial is */
656 /* 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 */
657 /* Note that we take it "backwards" and put the highest-order term in */
658 /* the lowest-order bit. The X^32 term is "implied"; the LSB is the */
659 /* X^31 term, etc. The X^0 term (usually shown as "+1") results in */
660 /* the MSB being 1. */
662 /* Note that the usual hardware shift register implementation, which */
663 /* is what we're using (we're merely optimizing it by doing eight-bit */
664 /* chunks at a time) shifts bits into the lowest-order term. In our */
665 /* implementation, that means shifting towards the right. Why do we */
666 /* do it this way? Because the calculated CRC must be transmitted in */
667 /* order from highest-order term to lowest-order term. UARTs transmit */
668 /* characters in order from LSB to MSB. By storing the CRC this way, */
669 /* we hand it to the UART in the order low-byte to high-byte; the UART */
670 /* sends each low-bit to hight-bit; and the result is transmission bit */
671 /* by bit from highest- to lowest-order term without requiring any bit */
672 /* shuffling on our part. Reception works similarly. */
674 /* The feedback terms table consists of 256, 32-bit entries. Notes: */
675 /* */
676 /* 1. The table can be generated at runtime if desired; code to do so */
677 /* is shown later. It might not be obvious, but the feedback */
678 /* terms simply represent the results of eight shift/xor opera- */
679 /* tions for all combinations of data and CRC register values. */
680 /* */
681 /* 2. The CRC accumulation logic is the same for all CRC polynomials, */
682 /* be they sixteen or thirty-two bits wide. You simply choose the */
683 /* appropriate table. Alternatively, because the table can be */
684 /* generated at runtime, you can start by generating the table for */
685 /* the polynomial in question and use exactly the same "updcrc", */
686 /* if your application needn't simultaneously handle two CRC */
687 /* polynomials. (Note, however, that XMODEM is strange.) */
688 /* */
689 /* 3. For 16-bit CRCs, the table entries need be only 16 bits wide; */
690 /* of course, 32-bit entries work OK if the high 16 bits are zero. */
691 /* */
692 /* 4. The values must be right-shifted by eight bits by the "updcrc" */
693 /* logic; the shift must be unsigned (bring in zeroes). On some */
694 /* hardware you could probably optimize the shift in assembler by */
695 /* using byte-swap instructions. */
698 static DWORD calc_crc32(struct elf_file_map* fmap)
700 #define UPDC32(octet,crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
701 static const DWORD crc_32_tab[] =
702 { /* CRC polynomial 0xedb88320 */
703 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
704 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
705 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
706 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
707 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
708 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
709 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
710 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
711 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
712 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
713 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
714 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
715 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
716 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
717 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
718 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
719 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
720 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
721 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
722 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
723 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
724 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
725 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
726 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
727 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
728 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
729 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
730 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
731 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
732 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
733 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
734 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
735 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
736 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
737 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
738 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
739 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
740 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
741 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
742 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
743 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
744 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
745 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
747 int i, r;
748 unsigned char buffer[256];
749 DWORD crc = ~0;
751 lseek(fmap->fd, 0, SEEK_SET);
752 while ((r = read(fmap->fd, buffer, sizeof(buffer))) > 0)
754 for (i = 0; i < r; i++) crc = UPDC32(buffer[i], crc);
756 return ~crc;
757 #undef UPDC32
760 /******************************************************************
761 * elf_load_debug_info_from_map
763 * Loads the symbolic information from ELF module which mapping is described
764 * in fmap
765 * the module has been loaded at 'load_offset' address, so symbols' address
766 * relocation is performed.
767 * CRC is checked if fmap->with_crc is TRUE
768 * returns
769 * 0 if the file doesn't contain symbolic info (or this info cannot be
770 * read or parsed)
771 * 1 on success
773 static BOOL elf_load_debug_info_from_map(struct module* module,
774 struct elf_file_map* fmap,
775 struct pool* pool,
776 struct hash_table* ht_symtab)
778 BOOL ret = FALSE;
779 const char* shstrtab;
780 int i;
781 int symtab_sect, dynsym_sect, stab_sect, stabstr_sect;
782 int debug_sect, debug_str_sect, debug_abbrev_sect, debug_line_sect;
783 int debuglink_sect;
784 struct thunk_area thunks[] =
786 {"__wine_spec_import_thunks", THUNK_ORDINAL_NOTYPE, 0, 0}, /* inter DLL calls */
787 {"__wine_spec_delayed_import_loaders", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
788 {"__wine_spec_delayed_import_thunks", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
789 {"__wine_delay_load", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
790 {"__wine_spec_thunk_text_16", -16, 0, 0}, /* 16 => 32 thunks */
791 {"__wine_spec_thunk_text_32", -32, 0, 0}, /* 32 => 16 thunks */
792 {NULL, 0, 0, 0}
795 if (fmap->with_crc && (fmap->crc != calc_crc32(fmap)))
797 ERR("Bad CRC for module %s (got %08lx while expecting %08lx)\n",
798 module->module.ImageName, calc_crc32(fmap), fmap->crc);
799 /* we don't tolerate mis-matched files */
800 return FALSE;
804 * Next, we need to find a few of the internal ELF headers within
805 * this thing. We need the main executable header, and the section
806 * table.
808 shstrtab = elf_map_section(fmap, fmap->elfhdr.e_shstrndx);
809 if (shstrtab == NO_MAP) return FALSE;
811 symtab_sect = dynsym_sect = stab_sect = stabstr_sect = -1;
812 debug_sect = debug_str_sect = debug_abbrev_sect = debug_line_sect = -1;
813 debuglink_sect = -1;
815 for (i = 0; i < fmap->elfhdr.e_shnum; i++)
817 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".stab") == 0)
818 stab_sect = i;
819 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".stabstr") == 0)
820 stabstr_sect = i;
821 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_info") == 0)
822 debug_sect = i;
823 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_str") == 0)
824 debug_str_sect = i;
825 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_abbrev") == 0)
826 debug_abbrev_sect = i;
827 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_line") == 0)
828 debug_line_sect = i;
829 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".gnu_debuglink") == 0)
830 debuglink_sect = i;
831 if ((strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".symtab") == 0) &&
832 (fmap->sect[i].shdr.sh_type == SHT_SYMTAB))
833 symtab_sect = i;
834 if ((strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".dynsym") == 0) &&
835 (fmap->sect[i].shdr.sh_type == SHT_DYNSYM))
836 dynsym_sect = i;
838 elf_unmap_section(fmap, fmap->elfhdr.e_shstrndx);
839 shstrtab = NULL;
841 if (symtab_sect == -1)
843 /* if we don't have a symtab but a dynsym, process the dynsym
844 * section instead. It'll contain less (relevant) information,
845 * but it'll be better than nothing
847 if (dynsym_sect == -1) return FALSE;
848 symtab_sect = dynsym_sect;
851 module->module.SymType = SymExport;
853 /* create a hash table for the symtab */
854 elf_hash_symtab(module, pool, ht_symtab, fmap, symtab_sect, thunks);
856 if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
858 if (stab_sect != -1 && stabstr_sect != -1)
860 const char* stab;
861 const char* stabstr;
863 stab = elf_map_section(fmap, stab_sect);
864 stabstr = elf_map_section(fmap, stabstr_sect);
865 if (stab != NO_MAP && stabstr != NO_MAP)
867 /* OK, now just parse all of the stabs. */
868 ret = stabs_parse(module, module->elf_info->elf_addr,
869 stab, fmap->sect[stab_sect].shdr.sh_size,
870 stabstr, fmap->sect[stabstr_sect].shdr.sh_size);
872 elf_unmap_section(fmap, stab_sect);
873 elf_unmap_section(fmap, stabstr_sect);
875 if (!ret)
877 WARN("Couldn't correctly read stabs\n");
878 return FALSE;
880 /* and fill in the missing information for stabs */
881 elf_finish_stabs_info(module, ht_symtab);
883 else if (debug_sect != -1)
885 /* Dwarf 2 debug information */
886 const BYTE* dw2_debug;
887 const BYTE* dw2_debug_abbrev;
888 const BYTE* dw2_debug_str;
890 FIXME("Alpha-support for Dwarf2 information for %s\n", module->module.ModuleName);
892 dw2_debug = (const BYTE*) elf_map_section(fmap, debug_sect);
893 dw2_debug_abbrev = (const BYTE*) elf_map_section(fmap, debug_abbrev_sect);
894 dw2_debug_str = (const BYTE*) elf_map_section(fmap, debug_str_sect);
895 if (dw2_debug != NO_MAP && NO_MAP != dw2_debug_abbrev && dw2_debug_str != NO_MAP)
897 /* OK, now just parse dwarf2 debug infos. */
898 ret = dwarf2_parse(module, module->elf_info->elf_addr,
899 dw2_debug, fmap->sect[debug_sect].shdr.sh_size,
900 dw2_debug_abbrev, fmap->sect[debug_abbrev_sect].shdr.sh_size,
901 dw2_debug_str, fmap->sect[debug_str_sect].shdr.sh_size);
903 elf_unmap_section(fmap, debug_sect);
904 elf_unmap_section(fmap, debug_abbrev_sect);
905 elf_unmap_section(fmap, debug_str_sect);
906 if (!ret)
908 WARN("Couldn't correctly read stabs\n");
909 return FALSE;
912 else if (debuglink_sect != -1)
914 const char* dbg_link;
915 struct elf_file_map fmap_link;
917 dbg_link = elf_map_section(fmap, debuglink_sect);
918 /* The content of a debug link section is:
919 * 1/ a NULL terminated string, containing the file name for the
920 * debug info
921 * 2/ padding on 4 byte boundary
922 * 3/ CRC of the linked ELF file
924 if (dbg_link != NO_MAP && elf_map_file(dbg_link, &fmap_link))
926 fmap_link.crc = *(const DWORD*)(dbg_link + ((DWORD_PTR)(strlen(dbg_link) + 4) & ~3));
927 fmap_link.with_crc = 1;
928 ret = elf_load_debug_info_from_map(module, &fmap_link, pool,
929 ht_symtab);
930 if (!ret)
931 WARN("Couldn't load debug information from %s\n", dbg_link);
933 else
934 WARN("Couldn't load linked debug file for %s\n",
935 module->module.ModuleName);
936 elf_unmap_file(&fmap_link);
939 if (strstr(module->module.ModuleName, "<elf>") ||
940 !strcmp(module->module.ModuleName, "<wine-loader>"))
942 /* add the thunks for native libraries */
943 if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
944 elf_new_wine_thunks(module, ht_symtab,
945 sizeof(thunks) / sizeof(thunks[0]), thunks);
947 /* add all the public symbols from symtab */
948 if (elf_new_public_symbols(module, ht_symtab) && !ret) ret = TRUE;
950 return ret;
953 /******************************************************************
954 * elf_load_debug_info
956 * Loads ELF debugging information from the module image file.
958 BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
960 BOOL ret = TRUE;
961 struct pool pool;
962 struct hash_table ht_symtab;
963 struct elf_file_map my_fmap;
965 if (module->type != DMT_ELF || !module->elf_info)
967 ERR("Bad elf module '%s'\n", module->module.LoadedImageName);
968 return FALSE;
971 pool_init(&pool, 65536);
972 hash_table_init(&pool, &ht_symtab, 256);
974 if (!fmap)
976 fmap = &my_fmap;
977 ret = elf_map_file(module->module.LoadedImageName, fmap);
979 if (ret)
980 ret = elf_load_debug_info_from_map(module, fmap, &pool, &ht_symtab);
982 pool_destroy(&pool);
983 if (fmap == &my_fmap) elf_unmap_file(fmap);
984 return ret;
987 /******************************************************************
988 * elf_fetch_file_info
990 * Gathers some more information for an ELF module from a given file
992 BOOL elf_fetch_file_info(const char* name, DWORD* base,
993 DWORD* size, DWORD* checksum)
995 struct elf_file_map fmap;
996 if (!elf_map_file(name, &fmap)) return FALSE;
997 if (base) *base = fmap.elf_start;
998 *size = fmap.elf_size;
999 *checksum = calc_crc32(&fmap);
1000 elf_unmap_file(&fmap);
1001 return TRUE;
1004 /******************************************************************
1005 * is_dt_flag_valid
1006 * returns true iff the section tag is valid
1008 static unsigned is_dt_flag_valid(unsigned d_tag)
1010 #ifndef DT_PROCNUM
1011 #define DT_PROCNUM 0
1012 #endif
1013 #ifndef DT_EXTRANUM
1014 #define DT_EXTRANUM 0
1015 #endif
1016 return (d_tag >= 0 && d_tag < DT_NUM + DT_PROCNUM + DT_EXTRANUM)
1017 #if defined(DT_LOOS) && defined(DT_HIOS)
1018 || (d_tag >= DT_LOOS && d_tag < DT_HIOS)
1019 #endif
1020 #if defined(DT_LOPROC) && defined(DT_HIPROC)
1021 || (d_tag >= DT_LOPROC && d_tag < DT_HIPROC)
1022 #endif
1026 /******************************************************************
1027 * elf_load_file
1029 * Loads the information for ELF module stored in 'filename'
1030 * the module has been loaded at 'load_offset' address
1031 * returns
1032 * -1 if the file cannot be found/opened
1033 * 0 if the file doesn't contain symbolic info (or this info cannot be
1034 * read or parsed)
1035 * 1 on success
1037 static BOOL elf_load_file(struct process* pcs, const char* filename,
1038 unsigned long load_offset, struct elf_info* elf_info)
1040 BOOL ret = FALSE;
1041 struct elf_file_map fmap;
1042 int i;
1044 TRACE("Processing elf file '%s' at %08lx\n", filename, load_offset);
1046 if (!elf_map_file(filename, &fmap)) goto leave;
1048 /* Next, we need to find a few of the internal ELF headers within
1049 * this thing. We need the main executable header, and the section
1050 * table.
1052 if (!fmap.elf_start && !load_offset)
1053 ERR("Relocatable ELF %s, but no load address. Loading at 0x0000000\n",
1054 filename);
1055 if (fmap.elf_start && load_offset)
1057 WARN("Non-relocatable ELF %s, but load address of 0x%08lx supplied. "
1058 "Assuming load address is corrupt\n", filename, load_offset);
1059 load_offset = 0;
1062 if (elf_info->flags & ELF_INFO_DEBUG_HEADER)
1064 const char* shstrtab = elf_map_section(&fmap, fmap.elfhdr.e_shstrndx);
1065 if (shstrtab == NO_MAP) goto leave;
1066 for (i = 0; i < fmap.elfhdr.e_shnum; i++)
1068 if (strcmp(shstrtab + fmap.sect[i].shdr.sh_name, ".dynamic") == 0 &&
1069 fmap.sect[i].shdr.sh_type == SHT_DYNAMIC)
1071 Elf32_Dyn dyn;
1072 char* ptr = (char*)fmap.sect[i].shdr.sh_addr;
1073 unsigned long len;
1077 if (!ReadProcessMemory(pcs->handle, ptr, &dyn, sizeof(dyn), &len) ||
1078 len != sizeof(dyn) || !is_dt_flag_valid(dyn.d_tag))
1079 dyn.d_tag = DT_NULL;
1080 ptr += sizeof(dyn);
1081 } while (dyn.d_tag != DT_DEBUG && dyn.d_tag != DT_NULL);
1082 if (dyn.d_tag == DT_NULL) goto leave;
1083 elf_info->dbg_hdr_addr = dyn.d_un.d_ptr;
1086 elf_unmap_section(&fmap, fmap.elfhdr.e_shstrndx);
1089 if (elf_info->flags & ELF_INFO_MODULE)
1091 struct elf_module_info *elf_module_info =
1092 HeapAlloc(GetProcessHeap(), 0, sizeof(struct elf_module_info));
1093 if (!elf_module_info) goto leave;
1094 elf_info->module = module_new(pcs, filename, DMT_ELF, FALSE,
1095 (load_offset) ? load_offset : fmap.elf_start,
1096 fmap.elf_size, 0, calc_crc32(&fmap));
1097 if (!elf_info->module)
1099 HeapFree(GetProcessHeap(), 0, elf_module_info);
1100 goto leave;
1102 elf_info->module->elf_info = elf_module_info;
1103 elf_info->module->elf_info->elf_addr = load_offset;
1105 if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
1107 elf_info->module->module.SymType = SymDeferred;
1108 ret = TRUE;
1110 else ret = elf_load_debug_info(elf_info->module, &fmap);
1112 elf_info->module->elf_info->elf_mark = 1;
1113 elf_info->module->elf_info->elf_loader = 0;
1114 } else ret = TRUE;
1116 if (elf_info->flags & ELF_INFO_NAME)
1118 elf_info->module_name = strcpy(HeapAlloc(GetProcessHeap(), 0,
1119 strlen(filename) + 1), filename);
1121 leave:
1122 elf_unmap_file(&fmap);
1124 return ret;
1127 /******************************************************************
1128 * elf_load_file_from_path
1129 * tries to load an ELF file from a set of paths (separated by ':')
1131 static BOOL elf_load_file_from_path(HANDLE hProcess,
1132 const char* filename,
1133 unsigned long load_offset,
1134 const char* path,
1135 struct elf_info* elf_info)
1137 BOOL ret = FALSE;
1138 char *s, *t, *fn;
1139 char* paths = NULL;
1141 if (!path) return FALSE;
1143 paths = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(path) + 1), path);
1144 for (s = paths; s && *s; s = (t) ? (t+1) : NULL)
1146 t = strchr(s, ':');
1147 if (t) *t = '\0';
1148 fn = HeapAlloc(GetProcessHeap(), 0, strlen(filename) + 1 + strlen(s) + 1);
1149 if (!fn) break;
1150 strcpy(fn, s);
1151 strcat(fn, "/");
1152 strcat(fn, filename);
1153 ret = elf_load_file(hProcess, fn, load_offset, elf_info);
1154 HeapFree(GetProcessHeap(), 0, fn);
1155 if (ret) break;
1156 s = (t) ? (t+1) : NULL;
1159 HeapFree(GetProcessHeap(), 0, paths);
1160 return ret;
1163 /******************************************************************
1164 * elf_load_file_from_dll_path
1166 * Tries to load an ELF file from the dll path
1168 static BOOL elf_load_file_from_dll_path(HANDLE hProcess,
1169 const char* filename,
1170 unsigned long load_offset,
1171 struct elf_info* elf_info)
1173 BOOL ret = FALSE;
1174 unsigned int index = 0;
1175 const char *path;
1177 while (!ret && (path = wine_dll_enum_load_path( index++ )))
1179 char *name = HeapAlloc( GetProcessHeap(), 0, strlen(path) + strlen(filename) + 2 );
1180 if (!name) break;
1181 strcpy( name, path );
1182 strcat( name, "/" );
1183 strcat( name, filename );
1184 ret = elf_load_file(hProcess, name, load_offset, elf_info);
1185 HeapFree( GetProcessHeap(), 0, name );
1187 return ret;
1190 /******************************************************************
1191 * elf_search_and_load_file
1193 * lookup a file in standard ELF locations, and if found, load it
1195 static BOOL elf_search_and_load_file(struct process* pcs, const char* filename,
1196 unsigned long load_offset,
1197 struct elf_info* elf_info)
1199 BOOL ret = FALSE;
1200 struct module* module;
1202 if (filename == NULL || *filename == '\0') return FALSE;
1203 if ((module = module_find_by_name(pcs, filename, DMT_ELF)))
1205 elf_info->module = module;
1206 module->elf_info->elf_mark = 1;
1207 return module->module.SymType;
1210 if (strstr(filename, "libstdc++")) return FALSE; /* We know we can't do it */
1211 ret = elf_load_file(pcs, filename, load_offset, elf_info);
1212 /* if relative pathname, try some absolute base dirs */
1213 if (!ret && !strchr(filename, '/'))
1215 ret = elf_load_file_from_path(pcs, filename, load_offset,
1216 getenv("PATH"), elf_info) ||
1217 elf_load_file_from_path(pcs, filename, load_offset,
1218 getenv("LD_LIBRARY_PATH"), elf_info);
1219 if (!ret) ret = elf_load_file_from_dll_path(pcs, filename, load_offset, elf_info);
1222 return ret;
1225 /******************************************************************
1226 * elf_enum_modules_internal
1228 * Enumerate ELF modules from a running process
1230 static BOOL elf_enum_modules_internal(const struct process* pcs,
1231 const char* main_name,
1232 elf_enum_modules_cb cb, void* user)
1234 struct r_debug dbg_hdr;
1235 void* lm_addr;
1236 struct link_map lm;
1237 char bufstr[256];
1239 if (!pcs->dbg_hdr_addr ||
1240 !ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr,
1241 &dbg_hdr, sizeof(dbg_hdr), NULL))
1242 return FALSE;
1244 /* Now walk the linked list. In all known ELF implementations,
1245 * the dynamic loader maintains this linked list for us. In some
1246 * cases the first entry doesn't appear with a name, in other cases it
1247 * does.
1249 for (lm_addr = (void*)dbg_hdr.r_map; lm_addr; lm_addr = (void*)lm.l_next)
1251 if (!ReadProcessMemory(pcs->handle, lm_addr, &lm, sizeof(lm), NULL))
1252 return FALSE;
1254 if (lm.l_prev != NULL && /* skip first entry, normally debuggee itself */
1255 lm.l_name != NULL &&
1256 ReadProcessMemory(pcs->handle, lm.l_name, bufstr, sizeof(bufstr), NULL))
1258 bufstr[sizeof(bufstr) - 1] = '\0';
1259 if (main_name && !bufstr[0]) strcpy(bufstr, main_name);
1260 if (!cb(bufstr, (unsigned long)lm.l_addr, user)) break;
1263 return TRUE;
1266 struct elf_sync
1268 struct process* pcs;
1269 struct elf_info elf_info;
1272 static BOOL elf_enum_sync_cb(const char* name, unsigned long addr, void* user)
1274 struct elf_sync* es = user;
1276 elf_search_and_load_file(es->pcs, name, addr, &es->elf_info);
1277 return TRUE;
1280 /******************************************************************
1281 * elf_synchronize_module_list
1283 * this functions rescans the debuggee module's list and synchronizes it with
1284 * the one from 'pcs', ie:
1285 * - if a module is in debuggee and not in pcs, it's loaded into pcs
1286 * - if a module is in pcs and not in debuggee, it's unloaded from pcs
1288 BOOL elf_synchronize_module_list(struct process* pcs)
1290 struct module* module;
1291 struct elf_sync es;
1293 for (module = pcs->lmodules; module; module = module->next)
1295 if (module->type == DMT_ELF && !module->is_virtual)
1296 module->elf_info->elf_mark = 0;
1299 es.pcs = pcs;
1300 es.elf_info.flags = ELF_INFO_MODULE;
1301 if (!elf_enum_modules_internal(pcs, NULL, elf_enum_sync_cb, &es))
1302 return FALSE;
1304 module = pcs->lmodules;
1305 while (module)
1307 if (module->type == DMT_ELF && !module->is_virtual &&
1308 !module->elf_info->elf_mark && !module->elf_info->elf_loader)
1310 module_remove(pcs, module);
1311 /* restart all over */
1312 module = pcs->lmodules;
1314 else module = module->next;
1316 return TRUE;
1319 /******************************************************************
1320 * elf_search_loader
1322 * Lookup in a running ELF process the loader, and sets its ELF link
1323 * address (for accessing the list of loaded .so libs) in pcs.
1324 * If flags is ELF_INFO_MODULE, the module for the loader is also
1325 * added as a module into pcs.
1327 static BOOL elf_search_loader(struct process* pcs, struct elf_info* elf_info)
1329 BOOL ret;
1330 const char* ptr;
1332 /* All binaries are loaded with WINELOADER (if run from tree) or by the
1333 * main executable (either wine-kthread or wine-pthread)
1334 * FIXME: the heuristic used to know whether we need to load wine-pthread
1335 * or wine-kthread is not 100% safe
1337 if ((ptr = getenv("WINELOADER")))
1338 ret = elf_search_and_load_file(pcs, ptr, 0, elf_info);
1339 else
1341 ret = elf_search_and_load_file(pcs, "wine-kthread", 0, elf_info) ||
1342 elf_search_and_load_file(pcs, "wine-pthread", 0, elf_info);
1344 return ret;
1347 /******************************************************************
1348 * elf_read_wine_loader_dbg_info
1350 * Try to find a decent wine executable which could have loaded the debuggee
1352 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1354 struct elf_info elf_info;
1356 elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_MODULE;
1357 if (!elf_search_loader(pcs, &elf_info)) return FALSE;
1358 elf_info.module->elf_info->elf_loader = 1;
1359 strcpy(elf_info.module->module.ModuleName, "<wine-loader>");
1360 return (pcs->dbg_hdr_addr = elf_info.dbg_hdr_addr) != 0;
1363 /******************************************************************
1364 * elf_enum_modules
1366 * Enumerates the ELF loaded modules from a running target (hProc)
1367 * This function doesn't require that someone has called SymInitialize
1368 * on this very process.
1370 BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb cb, void* user)
1372 struct process pcs;
1373 struct elf_info elf_info;
1374 BOOL ret;
1376 memset(&pcs, 0, sizeof(pcs));
1377 pcs.handle = hProc;
1378 elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_NAME;
1379 if (!elf_search_loader(&pcs, &elf_info)) return FALSE;
1380 pcs.dbg_hdr_addr = elf_info.dbg_hdr_addr;
1381 ret = elf_enum_modules_internal(&pcs, elf_info.module_name, cb, user);
1382 HeapFree(GetProcessHeap(), 0, (char*)elf_info.module_name);
1383 return ret;
1386 struct elf_load
1388 struct process* pcs;
1389 struct elf_info elf_info;
1390 const char* name;
1391 BOOL ret;
1394 /******************************************************************
1395 * elf_load_cb
1397 * Callback for elf_load_module, used to walk the list of loaded
1398 * modules.
1400 static BOOL elf_load_cb(const char* name, unsigned long addr, void* user)
1402 struct elf_load* el = user;
1403 const char* p;
1405 /* memcmp is needed for matches when bufstr contains also version information
1406 * el->name: libc.so, name: libc.so.6.0
1408 p = strrchr(name, '/');
1409 if (!p++) p = name;
1410 if (!memcmp(p, el->name, strlen(el->name)))
1412 el->ret = elf_search_and_load_file(el->pcs, name, addr, &el->elf_info);
1413 return FALSE;
1415 return TRUE;
1418 /******************************************************************
1419 * elf_load_module
1421 * loads an ELF module and stores it in process' module list
1422 * Also, find module real name and load address from
1423 * the real loaded modules list in pcs address space
1425 struct module* elf_load_module(struct process* pcs, const char* name, unsigned long addr)
1427 struct elf_load el;
1429 TRACE("(%p %s %08lx)\n", pcs, name, addr);
1431 el.elf_info.flags = ELF_INFO_MODULE;
1432 el.ret = FALSE;
1434 if (pcs->dbg_hdr_addr) /* we're debugging a life target */
1436 el.pcs = pcs;
1437 /* do only the lookup from the filename, not the path (as we lookup module
1438 * name in the process' loaded module list)
1440 el.name = strrchr(name, '/');
1441 if (!el.name++) el.name = name;
1442 el.ret = FALSE;
1444 if (!elf_enum_modules_internal(pcs, NULL, elf_load_cb, &el))
1445 return NULL;
1447 else if (addr)
1449 el.ret = elf_search_and_load_file(pcs, name, addr, &el.elf_info);
1451 if (!el.ret) return NULL;
1452 assert(el.elf_info.module);
1453 return el.elf_info.module;
1456 #else /* !__ELF__ */
1458 BOOL elf_synchronize_module_list(struct process* pcs)
1460 return FALSE;
1463 BOOL elf_fetch_file_info(const char* name, DWORD* base,
1464 DWORD* size, DWORD* checksum)
1466 return FALSE;
1469 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1471 return FALSE;
1474 BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb cb, void* user)
1476 return FALSE;
1479 struct module* elf_load_module(struct process* pcs, const char* name, DWORD addr)
1481 return NULL;
1484 BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
1486 return FALSE;
1488 #endif /* __ELF__ */