twain: Add a property sheet UI for scanning.
[wine/gsoc_dplay.git] / dlls / dbghelp / elf_module.c
blob9fd4d1ac6aaef77655998287fc2078dab697d1db
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 struct symt_compiland* compiland;
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(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 struct symt_compiland* compiland = 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 compiland = symname ? symt_new_compiland(module, symname) : NULL;
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->compiland = compiland;
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->compiland && !compiland_name) || (!ste->compiland && compiland_name))
381 continue;
382 if (ste->compiland && compiland_name)
384 const char* filename = source_get(module, ste->compiland->source);
385 if (strcmp(filename, compiland_name))
387 base = strrchr(filename, '/');
388 if (!base++) base = filename;
389 if (strcmp(base, compiland_basename)) continue;
392 if (result)
394 FIXME("Already found symbol %s (%s) in symtab %s @%08x and %s @%08x\n",
395 name, compiland_name,
396 source_get(module, result->compiland->source), result->symp->st_value,
397 source_get(module, ste->compiland->source), ste->symp->st_value);
399 else
401 result = ste;
402 ste->used = 1;
405 if (!result && !(result = weak_result))
407 FIXME("Couldn't find symbol %s!%s in symtab\n",
408 module->module.ModuleName, name);
409 return NULL;
411 return result->symp;
414 /******************************************************************
415 * elf_finish_stabs_info
417 * - get any relevant information (address & size) from the bits we got from the
418 * stabs debugging information
420 static void elf_finish_stabs_info(struct module* module, struct hash_table* symtab)
422 struct hash_table_iter hti;
423 void* ptr;
424 struct symt_ht* sym;
425 const Elf32_Sym* symp;
427 hash_table_iter_init(&module->ht_symbols, &hti, NULL);
428 while ((ptr = hash_table_iter_up(&hti)))
430 sym = GET_ENTRY(ptr, struct symt_ht, hash_elt);
431 switch (sym->symt.tag)
433 case SymTagFunction:
434 if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
435 ((struct symt_function*)sym)->size)
437 break;
439 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name,
440 ((struct symt_function*)sym)->container);
441 if (symp)
443 if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
444 ((struct symt_function*)sym)->address != module->elf_info->elf_addr + symp->st_value)
445 FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
446 sym, module->module.ModuleName, sym->hash_elt.name,
447 ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
448 if (((struct symt_function*)sym)->size && ((struct symt_function*)sym)->size != symp->st_size)
449 FIXME("Changing size for %p/%s!%s from %08lx to %08x\n",
450 sym, module->module.ModuleName, sym->hash_elt.name,
451 ((struct symt_function*)sym)->size, symp->st_size);
453 ((struct symt_function*)sym)->address = module->elf_info->elf_addr +
454 symp->st_value;
455 ((struct symt_function*)sym)->size = symp->st_size;
456 } else FIXME("Couldn't find %s!%s\n", module->module.ModuleName, sym->hash_elt.name);
457 break;
458 case SymTagData:
459 switch (((struct symt_data*)sym)->kind)
461 case DataIsGlobal:
462 case DataIsFileStatic:
463 if (((struct symt_data*)sym)->u.address != module->elf_info->elf_addr)
464 break;
465 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name,
466 ((struct symt_data*)sym)->container);
467 if (symp)
469 if (((struct symt_data*)sym)->u.address != module->elf_info->elf_addr &&
470 ((struct symt_data*)sym)->u.address != module->elf_info->elf_addr + symp->st_value)
471 FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
472 sym, module->module.ModuleName, sym->hash_elt.name,
473 ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
474 ((struct symt_data*)sym)->u.address = module->elf_info->elf_addr +
475 symp->st_value;
476 ((struct symt_data*)sym)->kind = (ELF32_ST_BIND(symp->st_info) == STB_LOCAL) ?
477 DataIsFileStatic : DataIsGlobal;
478 } else FIXME("Couldn't find %s!%s\n", module->module.ModuleName, sym->hash_elt.name);
479 break;
480 default:;
482 break;
483 default:
484 FIXME("Unsupported tag %u\n", sym->symt.tag);
485 break;
488 /* since we may have changed some addresses & sizes, mark the module to be resorted */
489 module->sortlist_valid = FALSE;
492 /******************************************************************
493 * elf_load_wine_thunks
495 * creating the thunk objects for a wine native DLL
497 static int elf_new_wine_thunks(struct module* module, struct hash_table* ht_symtab,
498 unsigned num_areas, struct thunk_area* thunks)
500 int j;
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 addr = module->elf_info->elf_addr + ste->symp->st_value;
513 for (j = 0; j < num_areas; j++)
515 if (ste->symp->st_value >= thunks[j].rva_start &&
516 ste->symp->st_value < thunks[j].rva_end)
517 break;
519 if (j < num_areas) /* thunk found */
521 symt_new_thunk(module, ste->compiland, ste->ht_elt.name, thunks[j].ordinal,
522 addr, ste->symp->st_size);
524 else
526 ULONG64 ref_addr;
528 idx = symt_find_nearest(module, addr);
529 if (idx != -1)
530 symt_get_info(&module->addr_sorttab[idx]->symt,
531 TI_GET_ADDRESS, &ref_addr);
532 if (idx == -1 || addr != ref_addr)
534 /* creating public symbols for all the ELF symbols which haven't been
535 * used yet (ie we have no debug information on them)
536 * That's the case, for example, of the .spec.c files
538 switch (ELF32_ST_TYPE(ste->symp->st_info))
540 case STT_FUNC:
541 symt_new_function(module, ste->compiland, ste->ht_elt.name,
542 addr, ste->symp->st_size, NULL);
543 break;
544 case STT_OBJECT:
545 symt_new_global_variable(module, ste->compiland, ste->ht_elt.name,
546 ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL,
547 addr, ste->symp->st_size, NULL);
548 break;
549 default:
550 FIXME("Shouldn't happen\n");
551 break;
553 /* FIXME: this is a hack !!!
554 * we are adding new symbols, but as we're parsing a symbol table
555 * (hopefully without duplicate symbols) we delay rebuilding the sorted
556 * module table until we're done with the symbol table
557 * Otherwise, as we intertwine symbols's add and lookup, performance
558 * is rather bad
560 module->sortlist_valid = TRUE;
562 else if (strcmp(ste->ht_elt.name, module->addr_sorttab[idx]->hash_elt.name))
564 ULONG64 xaddr = 0, xsize = 0;
565 DWORD kind = -1;
567 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_ADDRESS, &xaddr);
568 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_LENGTH, &xsize);
569 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_DATAKIND, &kind);
571 /* If none of symbols has a correct size, we consider they are both markers
572 * Hence, we can silence this warning
573 * Also, we check that we don't have two symbols, one local, the other
574 * global which is legal
576 if ((xsize || ste->symp->st_size) &&
577 (kind == (ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL) ? DataIsFileStatic : DataIsGlobal))
578 FIXME("Duplicate in %s: %s<%08lx-%08x> %s<%s-%s>\n",
579 module->module.ModuleName,
580 ste->ht_elt.name, addr, ste->symp->st_size,
581 module->addr_sorttab[idx]->hash_elt.name,
582 wine_dbgstr_longlong(xaddr), wine_dbgstr_longlong(xsize));
586 /* see comment above */
587 module->sortlist_valid = FALSE;
588 return TRUE;
591 /******************************************************************
592 * elf_new_public_symbols
594 * Creates a set of public symbols from an ELF symtab
596 static int elf_new_public_symbols(struct module* module, struct hash_table* symtab)
598 struct hash_table_iter hti;
599 struct symtab_elt* ste;
601 if (dbghelp_options & SYMOPT_NO_PUBLICS) return TRUE;
603 /* FIXME: we're missing the ELF entry point here */
605 hash_table_iter_init(symtab, &hti, NULL);
606 while ((ste = hash_table_iter_up(&hti)))
608 symt_new_public(module, ste->compiland, ste->ht_elt.name,
609 module->elf_info->elf_addr + ste->symp->st_value,
610 ste->symp->st_size, TRUE /* FIXME */,
611 ELF32_ST_TYPE(ste->symp->st_info) == STT_FUNC);
613 return TRUE;
616 /* Copyright (C) 1986 Gary S. Brown. Modified by Robert Shearman. You may use
617 the following calc_crc32 code or tables extracted from it, as desired without
618 restriction. */
620 /**********************************************************************\
621 |* Demonstration program to compute the 32-bit CRC used as the frame *|
622 |* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 *|
623 |* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level *|
624 |* protocol). The 32-bit FCS was added via the Federal Register, *|
625 |* 1 June 1982, p.23798. I presume but don't know for certain that *|
626 |* this polynomial is or will be included in CCITT V.41, which *|
627 |* defines the 16-bit CRC (often called CRC-CCITT) polynomial. FIPS *|
628 |* PUB 78 says that the 32-bit FCS reduces otherwise undetected *|
629 |* errors by a factor of 10^-5 over 16-bit FCS. *|
630 \**********************************************************************/
632 /* First, the polynomial itself and its table of feedback terms. The */
633 /* polynomial is */
634 /* 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 */
635 /* Note that we take it "backwards" and put the highest-order term in */
636 /* the lowest-order bit. The X^32 term is "implied"; the LSB is the */
637 /* X^31 term, etc. The X^0 term (usually shown as "+1") results in */
638 /* the MSB being 1. */
640 /* Note that the usual hardware shift register implementation, which */
641 /* is what we're using (we're merely optimizing it by doing eight-bit */
642 /* chunks at a time) shifts bits into the lowest-order term. In our */
643 /* implementation, that means shifting towards the right. Why do we */
644 /* do it this way? Because the calculated CRC must be transmitted in */
645 /* order from highest-order term to lowest-order term. UARTs transmit */
646 /* characters in order from LSB to MSB. By storing the CRC this way, */
647 /* we hand it to the UART in the order low-byte to high-byte; the UART */
648 /* sends each low-bit to hight-bit; and the result is transmission bit */
649 /* by bit from highest- to lowest-order term without requiring any bit */
650 /* shuffling on our part. Reception works similarly. */
652 /* The feedback terms table consists of 256, 32-bit entries. Notes: */
653 /* */
654 /* 1. The table can be generated at runtime if desired; code to do so */
655 /* is shown later. It might not be obvious, but the feedback */
656 /* terms simply represent the results of eight shift/xor opera- */
657 /* tions for all combinations of data and CRC register values. */
658 /* */
659 /* 2. The CRC accumulation logic is the same for all CRC polynomials, */
660 /* be they sixteen or thirty-two bits wide. You simply choose the */
661 /* appropriate table. Alternatively, because the table can be */
662 /* generated at runtime, you can start by generating the table for */
663 /* the polynomial in question and use exactly the same "updcrc", */
664 /* if your application needn't simultaneously handle two CRC */
665 /* polynomials. (Note, however, that XMODEM is strange.) */
666 /* */
667 /* 3. For 16-bit CRCs, the table entries need be only 16 bits wide; */
668 /* of course, 32-bit entries work OK if the high 16 bits are zero. */
669 /* */
670 /* 4. The values must be right-shifted by eight bits by the "updcrc" */
671 /* logic; the shift must be unsigned (bring in zeroes). On some */
672 /* hardware you could probably optimize the shift in assembler by */
673 /* using byte-swap instructions. */
676 static DWORD calc_crc32(struct elf_file_map* fmap)
678 #define UPDC32(octet,crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
679 static const DWORD crc_32_tab[] =
680 { /* CRC polynomial 0xedb88320 */
681 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
682 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
683 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
684 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
685 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
686 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
687 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
688 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
689 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
690 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
691 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
692 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
693 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
694 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
695 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
696 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
697 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
698 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
699 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
700 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
701 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
702 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
703 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
704 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
705 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
706 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
707 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
708 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
709 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
710 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
711 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
712 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
713 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
714 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
715 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
716 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
717 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
718 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
719 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
720 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
721 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
722 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
723 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
725 int i, r;
726 unsigned char buffer[256];
727 DWORD crc = ~0;
729 lseek(fmap->fd, 0, SEEK_SET);
730 while ((r = read(fmap->fd, buffer, sizeof(buffer))) > 0)
732 for (i = 0; i < r; i++) crc = UPDC32(buffer[i], crc);
734 return ~crc;
735 #undef UPDC32
738 /******************************************************************
739 * elf_load_debug_info_from_map
741 * Loads the symbolic information from ELF module which mapping is described
742 * in fmap
743 * the module has been loaded at 'load_offset' address, so symbols' address
744 * relocation is performed.
745 * CRC is checked if fmap->with_crc is TRUE
746 * returns
747 * 0 if the file doesn't contain symbolic info (or this info cannot be
748 * read or parsed)
749 * 1 on success
751 static BOOL elf_load_debug_info_from_map(struct module* module,
752 struct elf_file_map* fmap,
753 struct pool* pool,
754 struct hash_table* ht_symtab)
756 BOOL ret = FALSE;
757 const char* shstrtab;
758 int i;
759 int symtab_sect, dynsym_sect, stab_sect, stabstr_sect;
760 int debug_sect, debug_str_sect, debug_abbrev_sect, debug_line_sect;
761 int debuglink_sect;
762 struct thunk_area thunks[] =
764 {"__wine_spec_import_thunks", THUNK_ORDINAL_NOTYPE, 0, 0}, /* inter DLL calls */
765 {"__wine_spec_delayed_import_loaders", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
766 {"__wine_spec_delayed_import_thunks", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
767 {"__wine_delay_load", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
768 {"__wine_spec_thunk_text_16", -16, 0, 0}, /* 16 => 32 thunks */
769 {"__wine_spec_thunk_text_32", -32, 0, 0}, /* 32 => 16 thunks */
770 {NULL, 0, 0, 0}
773 if (fmap->with_crc && (fmap->crc != calc_crc32(fmap)))
775 ERR("Bad CRC for module %s (got %08lx while expecting %08lx)\n",
776 module->module.ImageName, calc_crc32(fmap), fmap->crc);
777 /* we don't tolerate mis-matched files */
778 return FALSE;
782 * Next, we need to find a few of the internal ELF headers within
783 * this thing. We need the main executable header, and the section
784 * table.
786 shstrtab = elf_map_section(fmap, fmap->elfhdr.e_shstrndx);
787 if (shstrtab == NO_MAP) return FALSE;
789 symtab_sect = dynsym_sect = stab_sect = stabstr_sect = -1;
790 debug_sect = debug_str_sect = debug_abbrev_sect = debug_line_sect = -1;
791 debuglink_sect = -1;
793 for (i = 0; i < fmap->elfhdr.e_shnum; i++)
795 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".stab") == 0)
796 stab_sect = i;
797 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".stabstr") == 0)
798 stabstr_sect = i;
799 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_info") == 0)
800 debug_sect = i;
801 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_str") == 0)
802 debug_str_sect = i;
803 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_abbrev") == 0)
804 debug_abbrev_sect = i;
805 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_line") == 0)
806 debug_line_sect = i;
807 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".gnu_debuglink") == 0)
808 debuglink_sect = i;
809 if ((strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".symtab") == 0) &&
810 (fmap->sect[i].shdr.sh_type == SHT_SYMTAB))
811 symtab_sect = i;
812 if ((strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".dynsym") == 0) &&
813 (fmap->sect[i].shdr.sh_type == SHT_DYNSYM))
814 dynsym_sect = i;
816 elf_unmap_section(fmap, fmap->elfhdr.e_shstrndx);
817 shstrtab = NULL;
819 if (symtab_sect == -1)
821 /* if we don't have a symtab but a dynsym, process the dynsym
822 * section instead. It'll contain less (relevant) information,
823 * but it'll be better than nothing
825 if (dynsym_sect == -1) return FALSE;
826 symtab_sect = dynsym_sect;
829 module->module.SymType = SymExport;
831 /* create a hash table for the symtab */
832 elf_hash_symtab(module, pool, ht_symtab, fmap, symtab_sect, thunks);
834 if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
836 if (stab_sect != -1 && stabstr_sect != -1)
838 const char* stab;
839 const char* stabstr;
841 stab = elf_map_section(fmap, stab_sect);
842 stabstr = elf_map_section(fmap, stabstr_sect);
843 if (stab != NO_MAP && stabstr != NO_MAP)
845 /* OK, now just parse all of the stabs. */
846 ret = stabs_parse(module, module->elf_info->elf_addr,
847 stab, fmap->sect[stab_sect].shdr.sh_size,
848 stabstr, fmap->sect[stabstr_sect].shdr.sh_size);
850 elf_unmap_section(fmap, stab_sect);
851 elf_unmap_section(fmap, stabstr_sect);
853 if (!ret)
855 WARN("Couldn't correctly read stabs\n");
856 return FALSE;
858 /* and fill in the missing information for stabs */
859 elf_finish_stabs_info(module, ht_symtab);
861 else if (debug_sect != -1)
863 /* Dwarf 2 debug information */
864 const BYTE* dw2_debug;
865 const BYTE* dw2_debug_abbrev;
866 const BYTE* dw2_debug_str;
868 FIXME("Alpha-support for Dwarf2 information for %s\n", module->module.ModuleName);
870 dw2_debug = (const BYTE*) elf_map_section(fmap, debug_sect);
871 dw2_debug_abbrev = (const BYTE*) elf_map_section(fmap, debug_abbrev_sect);
872 dw2_debug_str = (const BYTE*) elf_map_section(fmap, debug_str_sect);
873 if (dw2_debug != NO_MAP && NO_MAP != dw2_debug_abbrev && dw2_debug_str != NO_MAP)
875 /* OK, now just parse dwarf2 debug infos. */
876 ret = dwarf2_parse(module, module->elf_info->elf_addr,
877 dw2_debug, fmap->sect[debug_sect].shdr.sh_size,
878 dw2_debug_abbrev, fmap->sect[debug_abbrev_sect].shdr.sh_size,
879 dw2_debug_str, fmap->sect[debug_str_sect].shdr.sh_size);
881 elf_unmap_section(fmap, debug_sect);
882 elf_unmap_section(fmap, debug_abbrev_sect);
883 elf_unmap_section(fmap, debug_str_sect);
884 if (!ret)
886 WARN("Couldn't correctly read stabs\n");
887 return FALSE;
890 else if (debuglink_sect != -1)
892 const char* dbg_link;
893 struct elf_file_map fmap_link;
895 dbg_link = elf_map_section(fmap, debuglink_sect);
896 /* The content of a debug link section is:
897 * 1/ a NULL terminated string, containing the file name for the
898 * debug info
899 * 2/ padding on 4 byte boundary
900 * 3/ CRC of the linked ELF file
902 if (dbg_link != NO_MAP && elf_map_file(dbg_link, &fmap_link))
904 fmap_link.crc = *(const DWORD*)(dbg_link + ((DWORD_PTR)(strlen(dbg_link) + 4) & ~3));
905 fmap_link.with_crc = 1;
906 ret = elf_load_debug_info_from_map(module, &fmap_link, pool,
907 ht_symtab);
908 if (!ret)
909 WARN("Couldn't load debug information from %s\n", dbg_link);
911 else
912 WARN("Couldn't load linked debug file for %s\n",
913 module->module.ModuleName);
914 elf_unmap_file(&fmap_link);
917 if (strstr(module->module.ModuleName, "<elf>") ||
918 !strcmp(module->module.ModuleName, "<wine-loader>"))
920 /* add the thunks for native libraries */
921 if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
922 elf_new_wine_thunks(module, ht_symtab,
923 sizeof(thunks) / sizeof(thunks[0]), thunks);
925 /* add all the public symbols from symtab */
926 if (elf_new_public_symbols(module, ht_symtab) && !ret) ret = TRUE;
928 return ret;
931 /******************************************************************
932 * elf_load_debug_info
934 * Loads ELF debugging information from the module image file.
936 BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
938 BOOL ret = TRUE;
939 struct pool pool;
940 struct hash_table ht_symtab;
941 struct elf_file_map my_fmap;
943 if (module->type != DMT_ELF || !module->elf_info)
945 ERR("Bad elf module '%s'\n", module->module.LoadedImageName);
946 return FALSE;
949 pool_init(&pool, 65536);
950 hash_table_init(&pool, &ht_symtab, 256);
952 if (!fmap)
954 fmap = &my_fmap;
955 ret = elf_map_file(module->module.LoadedImageName, fmap);
957 if (ret)
958 ret = elf_load_debug_info_from_map(module, fmap, &pool, &ht_symtab);
960 pool_destroy(&pool);
961 if (fmap == &my_fmap) elf_unmap_file(fmap);
962 return ret;
965 /******************************************************************
966 * elf_fetch_file_info
968 * Gathers some more information for an ELF module from a given file
970 BOOL elf_fetch_file_info(const char* name, DWORD* base,
971 DWORD* size, DWORD* checksum)
973 struct elf_file_map fmap;
974 if (!elf_map_file(name, &fmap)) return FALSE;
975 if (base) *base = fmap.elf_start;
976 *size = fmap.elf_size;
977 *checksum = calc_crc32(&fmap);
978 elf_unmap_file(&fmap);
979 return TRUE;
982 /******************************************************************
983 * is_dt_flag_valid
984 * returns true iff the section tag is valid
986 static unsigned is_dt_flag_valid(unsigned d_tag)
988 #ifndef DT_PROCNUM
989 #define DT_PROCNUM 0
990 #endif
991 #ifndef DT_EXTRANUM
992 #define DT_EXTRANUM 0
993 #endif
994 return (d_tag >= 0 && d_tag < DT_NUM + DT_PROCNUM + DT_EXTRANUM)
995 #if defined(DT_LOOS) && defined(DT_HIOS)
996 || (d_tag >= DT_LOOS && d_tag < DT_HIOS)
997 #endif
998 #if defined(DT_LOPROC) && defined(DT_HIPROC)
999 || (d_tag >= DT_LOPROC && d_tag < DT_HIPROC)
1000 #endif
1004 /******************************************************************
1005 * elf_load_file
1007 * Loads the information for ELF module stored in 'filename'
1008 * the module has been loaded at 'load_offset' address
1009 * returns
1010 * -1 if the file cannot be found/opened
1011 * 0 if the file doesn't contain symbolic info (or this info cannot be
1012 * read or parsed)
1013 * 1 on success
1015 static BOOL elf_load_file(struct process* pcs, const char* filename,
1016 unsigned long load_offset, struct elf_info* elf_info)
1018 BOOL ret = FALSE;
1019 struct elf_file_map fmap;
1020 int i;
1022 TRACE("Processing elf file '%s' at %08lx\n", filename, load_offset);
1024 if (!elf_map_file(filename, &fmap)) goto leave;
1026 /* Next, we need to find a few of the internal ELF headers within
1027 * this thing. We need the main executable header, and the section
1028 * table.
1030 if (!fmap.elf_start && !load_offset)
1031 ERR("Relocatable ELF %s, but no load address. Loading at 0x0000000\n",
1032 filename);
1033 if (fmap.elf_start && load_offset)
1035 WARN("Non-relocatable ELF %s, but load address of 0x%08lx supplied. "
1036 "Assuming load address is corrupt\n", filename, load_offset);
1037 load_offset = 0;
1040 if (elf_info->flags & ELF_INFO_DEBUG_HEADER)
1042 const char* shstrtab = elf_map_section(&fmap, fmap.elfhdr.e_shstrndx);
1043 if (shstrtab == NO_MAP) goto leave;
1044 for (i = 0; i < fmap.elfhdr.e_shnum; i++)
1046 if (strcmp(shstrtab + fmap.sect[i].shdr.sh_name, ".dynamic") == 0 &&
1047 fmap.sect[i].shdr.sh_type == SHT_DYNAMIC)
1049 Elf32_Dyn dyn;
1050 char* ptr = (char*)fmap.sect[i].shdr.sh_addr;
1051 unsigned long len;
1055 if (!ReadProcessMemory(pcs->handle, ptr, &dyn, sizeof(dyn), &len) ||
1056 len != sizeof(dyn) || !is_dt_flag_valid(dyn.d_tag))
1057 dyn.d_tag = DT_NULL;
1058 ptr += sizeof(dyn);
1059 } while (dyn.d_tag != DT_DEBUG && dyn.d_tag != DT_NULL);
1060 if (dyn.d_tag == DT_NULL) goto leave;
1061 elf_info->dbg_hdr_addr = dyn.d_un.d_ptr;
1064 elf_unmap_section(&fmap, fmap.elfhdr.e_shstrndx);
1067 if (elf_info->flags & ELF_INFO_MODULE)
1069 struct elf_module_info *elf_module_info =
1070 HeapAlloc(GetProcessHeap(), 0, sizeof(struct elf_module_info));
1071 if (!elf_module_info) goto leave;
1072 elf_info->module = module_new(pcs, filename, DMT_ELF, FALSE,
1073 (load_offset) ? load_offset : fmap.elf_start,
1074 fmap.elf_size, 0, calc_crc32(&fmap));
1075 if (!elf_info->module)
1077 HeapFree(GetProcessHeap(), 0, elf_module_info);
1078 goto leave;
1080 elf_info->module->elf_info = elf_module_info;
1081 elf_info->module->elf_info->elf_addr = load_offset;
1083 if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
1085 elf_info->module->module.SymType = SymDeferred;
1086 ret = TRUE;
1088 else ret = elf_load_debug_info(elf_info->module, &fmap);
1090 elf_info->module->elf_info->elf_mark = 1;
1091 elf_info->module->elf_info->elf_loader = 0;
1092 } else ret = TRUE;
1094 if (elf_info->flags & ELF_INFO_NAME)
1096 elf_info->module_name = strcpy(HeapAlloc(GetProcessHeap(), 0,
1097 strlen(filename) + 1), filename);
1099 leave:
1100 elf_unmap_file(&fmap);
1102 return ret;
1105 /******************************************************************
1106 * elf_load_file_from_path
1107 * tries to load an ELF file from a set of paths (separated by ':')
1109 static BOOL elf_load_file_from_path(HANDLE hProcess,
1110 const char* filename,
1111 unsigned long load_offset,
1112 const char* path,
1113 struct elf_info* elf_info)
1115 BOOL ret = FALSE;
1116 char *s, *t, *fn;
1117 char* paths = NULL;
1119 if (!path) return FALSE;
1121 paths = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(path) + 1), path);
1122 for (s = paths; s && *s; s = (t) ? (t+1) : NULL)
1124 t = strchr(s, ':');
1125 if (t) *t = '\0';
1126 fn = HeapAlloc(GetProcessHeap(), 0, strlen(filename) + 1 + strlen(s) + 1);
1127 if (!fn) break;
1128 strcpy(fn, s);
1129 strcat(fn, "/");
1130 strcat(fn, filename);
1131 ret = elf_load_file(hProcess, fn, load_offset, elf_info);
1132 HeapFree(GetProcessHeap(), 0, fn);
1133 if (ret) break;
1134 s = (t) ? (t+1) : NULL;
1137 HeapFree(GetProcessHeap(), 0, paths);
1138 return ret;
1141 /******************************************************************
1142 * elf_load_file_from_dll_path
1144 * Tries to load an ELF file from the dll path
1146 static BOOL elf_load_file_from_dll_path(HANDLE hProcess,
1147 const char* filename,
1148 unsigned long load_offset,
1149 struct elf_info* elf_info)
1151 BOOL ret = FALSE;
1152 unsigned int index = 0;
1153 const char *path;
1155 while (!ret && (path = wine_dll_enum_load_path( index++ )))
1157 char *name = HeapAlloc( GetProcessHeap(), 0, strlen(path) + strlen(filename) + 2 );
1158 if (!name) break;
1159 strcpy( name, path );
1160 strcat( name, "/" );
1161 strcat( name, filename );
1162 ret = elf_load_file(hProcess, name, load_offset, elf_info);
1163 HeapFree( GetProcessHeap(), 0, name );
1165 return ret;
1168 /******************************************************************
1169 * elf_search_and_load_file
1171 * lookup a file in standard ELF locations, and if found, load it
1173 static BOOL elf_search_and_load_file(struct process* pcs, const char* filename,
1174 unsigned long load_offset,
1175 struct elf_info* elf_info)
1177 BOOL ret = FALSE;
1178 struct module* module;
1180 if (filename == NULL || *filename == '\0') return FALSE;
1181 if ((module = module_find_by_name(pcs, filename, DMT_ELF)))
1183 elf_info->module = module;
1184 module->elf_info->elf_mark = 1;
1185 return module->module.SymType;
1188 if (strstr(filename, "libstdc++")) return FALSE; /* We know we can't do it */
1189 ret = elf_load_file(pcs, filename, load_offset, elf_info);
1190 /* if relative pathname, try some absolute base dirs */
1191 if (!ret && !strchr(filename, '/'))
1193 ret = elf_load_file_from_path(pcs, filename, load_offset,
1194 getenv("PATH"), elf_info) ||
1195 elf_load_file_from_path(pcs, filename, load_offset,
1196 getenv("LD_LIBRARY_PATH"), elf_info);
1197 if (!ret) ret = elf_load_file_from_dll_path(pcs, filename, load_offset, elf_info);
1200 return ret;
1203 /******************************************************************
1204 * elf_enum_modules_internal
1206 * Enumerate ELF modules from a running process
1208 static BOOL elf_enum_modules_internal(const struct process* pcs,
1209 const char* main_name,
1210 elf_enum_modules_cb cb, void* user)
1212 struct r_debug dbg_hdr;
1213 void* lm_addr;
1214 struct link_map lm;
1215 char bufstr[256];
1217 if (!pcs->dbg_hdr_addr ||
1218 !ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr,
1219 &dbg_hdr, sizeof(dbg_hdr), NULL))
1220 return FALSE;
1222 /* Now walk the linked list. In all known ELF implementations,
1223 * the dynamic loader maintains this linked list for us. In some
1224 * cases the first entry doesn't appear with a name, in other cases it
1225 * does.
1227 for (lm_addr = (void*)dbg_hdr.r_map; lm_addr; lm_addr = (void*)lm.l_next)
1229 if (!ReadProcessMemory(pcs->handle, lm_addr, &lm, sizeof(lm), NULL))
1230 return FALSE;
1232 if (lm.l_prev != NULL && /* skip first entry, normally debuggee itself */
1233 lm.l_name != NULL &&
1234 ReadProcessMemory(pcs->handle, lm.l_name, bufstr, sizeof(bufstr), NULL))
1236 bufstr[sizeof(bufstr) - 1] = '\0';
1237 if (main_name && !bufstr[0]) strcpy(bufstr, main_name);
1238 if (!cb(bufstr, (unsigned long)lm.l_addr, user)) break;
1241 return TRUE;
1244 struct elf_sync
1246 struct process* pcs;
1247 struct elf_info elf_info;
1250 static BOOL elf_enum_sync_cb(const char* name, unsigned long addr, void* user)
1252 struct elf_sync* es = user;
1254 elf_search_and_load_file(es->pcs, name, addr, &es->elf_info);
1255 return TRUE;
1258 /******************************************************************
1259 * elf_synchronize_module_list
1261 * this functions rescans the debuggee module's list and synchronizes it with
1262 * the one from 'pcs', ie:
1263 * - if a module is in debuggee and not in pcs, it's loaded into pcs
1264 * - if a module is in pcs and not in debuggee, it's unloaded from pcs
1266 BOOL elf_synchronize_module_list(struct process* pcs)
1268 struct module* module;
1269 struct elf_sync es;
1271 for (module = pcs->lmodules; module; module = module->next)
1273 if (module->type == DMT_ELF && !module->is_virtual)
1274 module->elf_info->elf_mark = 0;
1277 es.pcs = pcs;
1278 es.elf_info.flags = ELF_INFO_MODULE;
1279 if (!elf_enum_modules_internal(pcs, NULL, elf_enum_sync_cb, &es))
1280 return FALSE;
1282 module = pcs->lmodules;
1283 while (module)
1285 if (module->type == DMT_ELF && !module->is_virtual &&
1286 !module->elf_info->elf_mark && !module->elf_info->elf_loader)
1288 module_remove(pcs, module);
1289 /* restart all over */
1290 module = pcs->lmodules;
1292 else module = module->next;
1294 return TRUE;
1297 /******************************************************************
1298 * elf_search_loader
1300 * Lookup in a running ELF process the loader, and sets its ELF link
1301 * address (for accessing the list of loaded .so libs) in pcs.
1302 * If flags is ELF_INFO_MODULE, the module for the loader is also
1303 * added as a module into pcs.
1305 static BOOL elf_search_loader(struct process* pcs, struct elf_info* elf_info)
1307 BOOL ret;
1308 const char* ptr;
1310 /* All binaries are loaded with WINELOADER (if run from tree) or by the
1311 * main executable (either wine-kthread or wine-pthread)
1312 * FIXME: the heuristic used to know whether we need to load wine-pthread
1313 * or wine-kthread is not 100% safe
1315 if ((ptr = getenv("WINELOADER")))
1316 ret = elf_search_and_load_file(pcs, ptr, 0, elf_info);
1317 else
1319 ret = elf_search_and_load_file(pcs, "wine-kthread", 0, elf_info) ||
1320 elf_search_and_load_file(pcs, "wine-pthread", 0, elf_info);
1322 return ret;
1325 /******************************************************************
1326 * elf_read_wine_loader_dbg_info
1328 * Try to find a decent wine executable which could have loaded the debuggee
1330 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1332 struct elf_info elf_info;
1334 elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_MODULE;
1335 if (!elf_search_loader(pcs, &elf_info)) return FALSE;
1336 elf_info.module->elf_info->elf_loader = 1;
1337 strcpy(elf_info.module->module.ModuleName, "<wine-loader>");
1338 return (pcs->dbg_hdr_addr = elf_info.dbg_hdr_addr) != 0;
1341 /******************************************************************
1342 * elf_enum_modules
1344 * Enumerates the ELF loaded modules from a running target (hProc)
1345 * This function doesn't require that someone has called SymInitialize
1346 * on this very process.
1348 BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb cb, void* user)
1350 struct process pcs;
1351 struct elf_info elf_info;
1352 BOOL ret;
1354 memset(&pcs, 0, sizeof(pcs));
1355 pcs.handle = hProc;
1356 elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_NAME;
1357 if (!elf_search_loader(&pcs, &elf_info)) return FALSE;
1358 pcs.dbg_hdr_addr = elf_info.dbg_hdr_addr;
1359 ret = elf_enum_modules_internal(&pcs, elf_info.module_name, cb, user);
1360 HeapFree(GetProcessHeap(), 0, (char*)elf_info.module_name);
1361 return ret;
1364 struct elf_load
1366 struct process* pcs;
1367 struct elf_info elf_info;
1368 const char* name;
1369 BOOL ret;
1372 /******************************************************************
1373 * elf_load_cb
1375 * Callback for elf_load_module, used to walk the list of loaded
1376 * modules.
1378 static BOOL elf_load_cb(const char* name, unsigned long addr, void* user)
1380 struct elf_load* el = user;
1381 const char* p;
1383 /* memcmp is needed for matches when bufstr contains also version information
1384 * el->name: libc.so, name: libc.so.6.0
1386 p = strrchr(name, '/');
1387 if (!p++) p = name;
1388 if (!memcmp(p, el->name, strlen(el->name)))
1390 el->ret = elf_search_and_load_file(el->pcs, name, addr, &el->elf_info);
1391 return FALSE;
1393 return TRUE;
1396 /******************************************************************
1397 * elf_load_module
1399 * loads an ELF module and stores it in process' module list
1400 * Also, find module real name and load address from
1401 * the real loaded modules list in pcs address space
1403 struct module* elf_load_module(struct process* pcs, const char* name, unsigned long addr)
1405 struct elf_load el;
1407 TRACE("(%p %s %08lx)\n", pcs, name, addr);
1409 el.elf_info.flags = ELF_INFO_MODULE;
1410 el.ret = FALSE;
1412 if (pcs->dbg_hdr_addr) /* we're debugging a life target */
1414 el.pcs = pcs;
1415 /* do only the lookup from the filename, not the path (as we lookup module
1416 * name in the process' loaded module list)
1418 el.name = strrchr(name, '/');
1419 if (!el.name++) el.name = name;
1420 el.ret = FALSE;
1422 if (!elf_enum_modules_internal(pcs, NULL, elf_load_cb, &el))
1423 return NULL;
1425 else if (addr)
1427 el.ret = elf_search_and_load_file(pcs, name, addr, &el.elf_info);
1429 if (!el.ret) return NULL;
1430 assert(el.elf_info.module);
1431 return el.elf_info.module;
1434 #else /* !__ELF__ */
1436 BOOL elf_synchronize_module_list(struct process* pcs)
1438 return FALSE;
1441 BOOL elf_fetch_file_info(const char* name, DWORD* base,
1442 DWORD* size, DWORD* checksum)
1444 return FALSE;
1447 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1449 return FALSE;
1452 BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb cb, void* user)
1454 return FALSE;
1457 struct module* elf_load_module(struct process* pcs, const char* name, DWORD addr)
1459 return NULL;
1462 BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
1464 return FALSE;
1466 #endif /* __ELF__ */