Added YUV routines needed for v4l driver, and in the future possibly
[wine/gsoc-2012-control.git] / dlls / dbghelp / elf_module.c
blobae8ddb1f5203a936dea0574acee4be905316c1b6
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"
24 #include <assert.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #ifdef HAVE_SYS_STAT_H
28 # include <sys/stat.h>
29 #endif
30 #include <fcntl.h>
31 #ifdef HAVE_SYS_MMAN_H
32 #include <sys/mman.h>
33 #endif
34 #ifdef HAVE_UNISTD_H
35 # include <unistd.h>
36 #endif
37 #ifndef PATH_MAX
38 #define PATH_MAX MAX_PATH
39 #endif
41 #include "dbghelp_private.h"
43 #if defined(__svr4__) || defined(__sun)
44 #define __ELF__
45 #endif
47 #ifdef HAVE_ELF_H
48 # include <elf.h>
49 #endif
50 #ifdef HAVE_SYS_ELF32_H
51 # include <sys/elf32.h>
52 #endif
53 #ifdef HAVE_SYS_EXEC_ELF_H
54 # include <sys/exec_elf.h>
55 #endif
56 #if !defined(DT_NUM)
57 # if defined(DT_COUNT)
58 # define DT_NUM DT_COUNT
59 # else
60 /* this seems to be a satisfactory value on Solaris, which doesn't support this AFAICT */
61 # define DT_NUM 24
62 # endif
63 #endif
64 #ifdef HAVE_LINK_H
65 # include <link.h>
66 #endif
67 #ifdef HAVE_SYS_LINK_H
68 # include <sys/link.h>
69 #endif
71 #include "wine/debug.h"
73 WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
75 struct elf_module_info
77 unsigned long elf_addr;
78 unsigned short elf_mark : 1,
79 elf_loader : 1;
82 #ifdef __ELF__
84 #define ELF_INFO_DEBUG_HEADER 0x0001
85 #define ELF_INFO_MODULE 0x0002
86 #define ELF_INFO_NAME 0x0004
88 struct elf_info
90 unsigned flags; /* IN one (or several) of the ELF_INFO constants */
91 unsigned long dbg_hdr_addr; /* OUT address of debug header (if ELF_INFO_DEBUG_HEADER is set) */
92 struct module* module; /* OUT loaded module (if ELF_INFO_MODULE is set) */
93 const char* module_name; /* OUT found module name (if ELF_INFO_NAME is set) */
96 #define NO_MAP ((const void*)0xffffffff)
97 /* structure holding information while handling an ELF image
98 * allows one by one section mapping for memory savings
100 struct elf_file_map
102 Elf32_Ehdr elfhdr;
103 size_t elf_size;
104 size_t elf_start;
105 struct
107 Elf32_Shdr shdr;
108 const char* mapped;
109 }* sect;
110 int fd;
111 unsigned with_crc;
112 unsigned long crc;
115 struct symtab_elt
117 struct hash_table_elt ht_elt;
118 const Elf32_Sym* symp;
119 const char* filename;
120 unsigned used;
123 struct thunk_area
125 const char* symname;
126 THUNK_ORDINAL ordinal;
127 unsigned long rva_start;
128 unsigned long rva_end;
131 /******************************************************************
132 * elf_map_section
134 * Maps a single section into memory from an ELF file
136 static const char* elf_map_section(struct elf_file_map* fmap, int sidx)
138 unsigned pgsz = getpagesize();
139 unsigned ofst, size;
141 if (sidx >= fmap->elfhdr.e_shnum ||
142 fmap->sect[sidx].shdr.sh_type == SHT_NOBITS)
143 return NO_MAP;
144 /* align required information on page size (we assume pagesize is a power of 2) */
145 ofst = fmap->sect[sidx].shdr.sh_offset & ~(pgsz - 1);
146 size = (fmap->sect[sidx].shdr.sh_offset +
147 fmap->sect[sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1);
148 fmap->sect[sidx].mapped = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fmap->fd, ofst);
149 if (fmap->sect[sidx].mapped == NO_MAP) return NO_MAP;
150 return fmap->sect[sidx].mapped + (fmap->sect[sidx].shdr.sh_offset & (pgsz - 1));
153 /******************************************************************
154 * elf_unmap_section
156 * Unmaps a single section from memory
158 static void elf_unmap_section(struct elf_file_map* fmap, int sidx)
160 if (sidx < fmap->elfhdr.e_shnum && fmap->sect[sidx].mapped != NO_MAP)
162 munmap((char*)fmap->sect[sidx].mapped, fmap->sect[sidx].shdr.sh_size);
163 fmap->sect[sidx].mapped = NO_MAP;
167 /******************************************************************
168 * elf_map_file
170 * Maps an ELF file into memory (and checks it's a real ELF file)
172 static BOOL elf_map_file(const char* filename, struct elf_file_map* fmap)
174 static const BYTE elf_signature[4] = { ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3 };
175 struct stat statbuf;
176 int i;
177 Elf32_Phdr phdr;
178 unsigned tmp, page_mask = getpagesize() - 1;
181 fmap->fd = -1;
182 fmap->with_crc = 0;
184 /* check that the file exists, and that the module hasn't been loaded yet */
185 if (stat(filename, &statbuf) == -1 || S_ISDIR(statbuf.st_mode)) return FALSE;
187 /* Now open the file, so that we can mmap() it. */
188 if ((fmap->fd = open(filename, O_RDONLY)) == -1) return FALSE;
190 if (read(fmap->fd, &fmap->elfhdr, sizeof(fmap->elfhdr)) != sizeof(fmap->elfhdr))
191 return FALSE;
192 /* and check for an ELF header */
193 if (memcmp(fmap->elfhdr.e_ident,
194 elf_signature, sizeof(elf_signature))) return FALSE;
196 fmap->sect = HeapAlloc(GetProcessHeap(), 0,
197 fmap->elfhdr.e_shnum * sizeof(fmap->sect[0]));
198 if (!fmap->sect) return FALSE;
200 lseek(fmap->fd, fmap->elfhdr.e_shoff, SEEK_SET);
201 for (i = 0; i < fmap->elfhdr.e_shnum; i++)
203 read(fmap->fd, &fmap->sect[i].shdr, sizeof(fmap->sect[i].shdr));
204 fmap->sect[i].mapped = NO_MAP;
207 /* grab size of module once loaded in memory */
208 lseek(fmap->fd, fmap->elfhdr.e_phoff, SEEK_SET);
209 fmap->elf_size = 0;
210 fmap->elf_start = ~0L;
211 for (i = 0; i < fmap->elfhdr.e_phnum; i++)
213 if (read(fmap->fd, &phdr, sizeof(phdr)) == sizeof(phdr) &&
214 phdr.p_type == PT_LOAD)
216 tmp = (phdr.p_vaddr + phdr.p_memsz + page_mask) & ~page_mask;
217 if (fmap->elf_size < tmp) fmap->elf_size = tmp;
218 if (phdr.p_vaddr < fmap->elf_start) fmap->elf_start = phdr.p_vaddr;
221 /* if non relocatable ELF, then remove fixed address from computation
222 * otherwise, all addresses are zero based and start has no effect
224 fmap->elf_size -= fmap->elf_start;
225 return TRUE;
228 /******************************************************************
229 * elf_unmap_file
231 * Unmaps an ELF file from memory (previously mapped with elf_map_file)
233 static void elf_unmap_file(struct elf_file_map* fmap)
235 if (fmap->fd != -1)
237 int i;
238 for (i = 0; i < fmap->elfhdr.e_shnum; i++)
240 elf_unmap_section(fmap, i);
242 HeapFree(GetProcessHeap(), 0, fmap->sect);
243 close(fmap->fd);
247 /******************************************************************
248 * elf_hash_symtab
250 * creating an internal hash table to ease use ELF symtab information lookup
252 static void elf_hash_symtab(const struct module* module, struct pool* pool,
253 struct hash_table* ht_symtab, struct elf_file_map* fmap,
254 int symtab_idx, struct thunk_area* thunks)
256 int i, j, nsym;
257 const char* strp;
258 const char* symname;
259 const char* filename = NULL;
260 const char* ptr;
261 const Elf32_Sym* symp;
262 struct symtab_elt* ste;
264 symp = (const Elf32_Sym*)elf_map_section(fmap, symtab_idx);
265 strp = elf_map_section(fmap, fmap->sect[symtab_idx].shdr.sh_link);
266 if (symp == NO_MAP || strp == NO_MAP) return;
268 nsym = fmap->sect[symtab_idx].shdr.sh_size / sizeof(*symp);
270 for (j = 0; thunks[j].symname; j++)
271 thunks[j].rva_start = thunks[j].rva_end = 0;
273 for (i = 0; i < nsym; i++, symp++)
275 /* Ignore certain types of entries which really aren't of that much
276 * interest.
278 if ((ELF32_ST_TYPE(symp->st_info) != STT_FILE &&
279 ELF32_ST_TYPE(symp->st_info) != STT_OBJECT &&
280 ELF32_ST_TYPE(symp->st_info) != STT_FUNC) ||
281 symp->st_shndx == SHN_UNDEF)
283 continue;
286 symname = strp + symp->st_name;
288 if (ELF32_ST_TYPE(symp->st_info) == STT_FILE)
290 filename = symname;
291 continue;
293 for (j = 0; thunks[j].symname; j++)
295 if (!strcmp(symname, thunks[j].symname))
297 thunks[j].rva_start = symp->st_value;
298 thunks[j].rva_end = symp->st_value + symp->st_size;
299 break;
302 if (thunks[j].symname) continue;
304 /* FIXME: we don't need to handle them (GCC internals)
305 * Moreover, they screw up our symbol lookup :-/
307 if (symname[0] == '.' && symname[1] == 'L' && isdigit(symname[2]))
308 continue;
310 ste = pool_alloc(pool, sizeof(*ste));
311 ste->ht_elt.name = symname;
312 /* GCC emits, in some cases, a .<digit>+ suffix.
313 * This is used for static variable inside functions, so
314 * that we can have several such variables with same name in
315 * the same compilation unit
316 * We simply ignore that suffix when present (we also get rid
317 * of it in stabs parsing)
319 ptr = symname + strlen(symname) - 1;
320 if (isdigit(*ptr))
322 while (isdigit(*ptr) && ptr >= symname) ptr--;
323 if (ptr > symname && *ptr == '.')
325 char* n = pool_alloc(pool, ptr - symname + 1);
326 memcpy(n, symname, ptr - symname + 1);
327 n[ptr - symname] = '\0';
328 ste->ht_elt.name = n;
331 ste->symp = symp;
332 ste->filename = filename;
333 ste->used = 0;
334 hash_table_add(ht_symtab, &ste->ht_elt);
336 /* as we added in the ht_symtab pointers to the symbols themselves,
337 * we cannot unmap yet the sections, it will be done when we're over
338 * with this ELF file
342 /******************************************************************
343 * elf_lookup_symtab
345 * lookup a symbol by name in our internal hash table for the symtab
347 static const Elf32_Sym* elf_lookup_symtab(const struct module* module,
348 const struct hash_table* ht_symtab,
349 const char* name, struct symt* compiland)
351 struct symtab_elt* weak_result = NULL; /* without compiland name */
352 struct symtab_elt* result = NULL;
353 struct hash_table_iter hti;
354 struct symtab_elt* ste;
355 const char* compiland_name;
356 const char* compiland_basename;
357 const char* base;
359 /* we need weak match up (at least) when symbols of same name,
360 * defined several times in different compilation units,
361 * are merged in a single one (hence a different filename for c.u.)
363 if (compiland)
365 compiland_name = source_get(module,
366 ((struct symt_compiland*)compiland)->source);
367 compiland_basename = strrchr(compiland_name, '/');
368 if (!compiland_basename++) compiland_basename = compiland_name;
370 else compiland_name = compiland_basename = NULL;
372 hash_table_iter_init(ht_symtab, &hti, name);
373 while ((ste = hash_table_iter_up(&hti)))
375 if (ste->used || strcmp(ste->ht_elt.name, name)) continue;
377 weak_result = ste;
378 if ((ste->filename && !compiland_name) || (!ste->filename && compiland_name))
379 continue;
380 if (ste->filename && compiland_name)
382 if (strcmp(ste->filename, compiland_name))
384 base = strrchr(ste->filename, '/');
385 if (!base++) base = ste->filename;
386 if (strcmp(base, compiland_basename)) continue;
389 if (result)
391 FIXME("Already found symbol %s (%s) in symtab %s @%08x and %s @%08x\n",
392 name, compiland_name, result->filename, result->symp->st_value,
393 ste->filename, ste->symp->st_value);
395 else
397 result = ste;
398 ste->used = 1;
401 if (!result && !(result = weak_result))
403 FIXME("Couldn't find symbol %s!%s in symtab\n",
404 module->module.ModuleName, name);
405 return NULL;
407 return result->symp;
410 /******************************************************************
411 * elf_finish_stabs_info
413 * - get any relevant information (address & size) from the bits we got from the
414 * stabs debugging information
416 static void elf_finish_stabs_info(struct module* module, struct hash_table* symtab)
418 struct hash_table_iter hti;
419 void* ptr;
420 struct symt_ht* sym;
421 const Elf32_Sym* symp;
423 hash_table_iter_init(&module->ht_symbols, &hti, NULL);
424 while ((ptr = hash_table_iter_up(&hti)))
426 sym = GET_ENTRY(ptr, struct symt_ht, hash_elt);
427 switch (sym->symt.tag)
429 case SymTagFunction:
430 if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
431 ((struct symt_function*)sym)->size)
433 break;
435 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name,
436 ((struct symt_function*)sym)->container);
437 if (symp)
439 if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
440 ((struct symt_function*)sym)->address != module->elf_info->elf_addr + symp->st_value)
441 FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
442 sym, module->module.ModuleName, sym->hash_elt.name,
443 ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
444 if (((struct symt_function*)sym)->size && ((struct symt_function*)sym)->size != symp->st_size)
445 FIXME("Changing size for %p/%s!%s from %08lx to %08x\n",
446 sym, module->module.ModuleName, sym->hash_elt.name,
447 ((struct symt_function*)sym)->size, symp->st_size);
449 ((struct symt_function*)sym)->address = module->elf_info->elf_addr +
450 symp->st_value;
451 ((struct symt_function*)sym)->size = symp->st_size;
452 } else FIXME("Couldn't find %s!%s\n", module->module.ModuleName, sym->hash_elt.name);
453 break;
454 case SymTagData:
455 switch (((struct symt_data*)sym)->kind)
457 case DataIsGlobal:
458 case DataIsFileStatic:
459 if (((struct symt_data*)sym)->u.address != module->elf_info->elf_addr)
460 break;
461 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name,
462 ((struct symt_data*)sym)->container);
463 if (symp)
465 if (((struct symt_data*)sym)->u.address != module->elf_info->elf_addr &&
466 ((struct symt_data*)sym)->u.address != module->elf_info->elf_addr + symp->st_value)
467 FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
468 sym, module->module.ModuleName, sym->hash_elt.name,
469 ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
470 ((struct symt_data*)sym)->u.address = module->elf_info->elf_addr +
471 symp->st_value;
472 ((struct symt_data*)sym)->kind = (ELF32_ST_BIND(symp->st_info) == STB_LOCAL) ?
473 DataIsFileStatic : DataIsGlobal;
474 } else FIXME("Couldn't find %s!%s\n", module->module.ModuleName, sym->hash_elt.name);
475 break;
476 default:;
478 break;
479 default:
480 FIXME("Unsupported tag %u\n", sym->symt.tag);
481 break;
484 /* since we may have changed some addresses & sizes, mark the module to be resorted */
485 module->sortlist_valid = FALSE;
488 /******************************************************************
489 * elf_load_wine_thunks
491 * creating the thunk objects for a wine native DLL
493 static int elf_new_wine_thunks(struct module* module, struct hash_table* ht_symtab,
494 unsigned num_areas, struct thunk_area* thunks)
496 int j;
497 struct symt_compiland* compiland = NULL;
498 const char* compiland_name = NULL;
499 struct hash_table_iter hti;
500 struct symtab_elt* ste;
501 DWORD addr;
502 int idx;
504 hash_table_iter_init(ht_symtab, &hti, NULL);
505 while ((ste = hash_table_iter_up(&hti)))
507 if (ste->used) continue;
509 /* FIXME: this is not a good idea anyway... we are creating several
510 * compiland objects for a same compilation unit
511 * We try to cache the last compiland used, but it's not enough
512 * (we should here only create compilands if they are not yet
513 * defined)
515 if (!compiland_name || compiland_name != ste->filename)
516 compiland = symt_new_compiland(module,
517 compiland_name = ste->filename);
519 addr = module->elf_info->elf_addr + ste->symp->st_value;
521 for (j = 0; j < num_areas; j++)
523 if (ste->symp->st_value >= thunks[j].rva_start &&
524 ste->symp->st_value < thunks[j].rva_end)
525 break;
527 if (j < num_areas) /* thunk found */
529 symt_new_thunk(module, compiland, ste->ht_elt.name, thunks[j].ordinal,
530 addr, ste->symp->st_size);
532 else
534 ULONG64 ref_addr;
536 idx = symt_find_nearest(module, addr);
537 if (idx != -1)
538 symt_get_info(&module->addr_sorttab[idx]->symt,
539 TI_GET_ADDRESS, &ref_addr);
540 if (idx == -1 || addr != ref_addr)
542 /* creating public symbols for all the ELF symbols which haven't been
543 * used yet (ie we have no debug information on them)
544 * That's the case, for example, of the .spec.c files
546 switch (ELF32_ST_TYPE(ste->symp->st_info))
548 case STT_FUNC:
549 symt_new_function(module, compiland, ste->ht_elt.name,
550 addr, ste->symp->st_size, NULL);
551 break;
552 case STT_OBJECT:
553 symt_new_global_variable(module, compiland, ste->ht_elt.name,
554 ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL,
555 addr, ste->symp->st_size, NULL);
556 break;
557 default:
558 FIXME("Shouldn't happen\n");
559 break;
561 /* FIXME: this is a hack !!!
562 * we are adding new symbols, but as we're parsing a symbol table
563 * (hopefully without duplicate symbols) we delay rebuilding the sorted
564 * module table until we're done with the symbol table
565 * Otherwise, as we intertwine symbols's add and lookup, performance
566 * is rather bad
568 module->sortlist_valid = TRUE;
570 else if (strcmp(ste->ht_elt.name, module->addr_sorttab[idx]->hash_elt.name))
572 ULONG64 xaddr = 0;
573 DWORD xsize = 0, kind = -1;
575 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_ADDRESS, &xaddr);
576 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_LENGTH, &xsize);
577 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_DATAKIND, &kind);
579 /* If none of symbols has a correct size, we consider they are both markers
580 * Hence, we can silence this warning
581 * Also, we check that we don't have two symbols, one local, the other
582 * global which is legal
584 if ((xsize || ste->symp->st_size) &&
585 (kind == (ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL) ? DataIsFileStatic : DataIsGlobal))
586 FIXME("Duplicate in %s: %s<%08lx-%08x> %s<%s-%08lx>\n",
587 module->module.ModuleName,
588 ste->ht_elt.name, addr, ste->symp->st_size,
589 module->addr_sorttab[idx]->hash_elt.name,
590 wine_dbgstr_longlong(xaddr), xsize);
594 /* see comment above */
595 module->sortlist_valid = FALSE;
596 return TRUE;
599 /******************************************************************
600 * elf_new_public_symbols
602 * Creates a set of public symbols from an ELF symtab
604 static int elf_new_public_symbols(struct module* module, struct hash_table* symtab)
606 struct symt_compiland* compiland = NULL;
607 const char* compiland_name = NULL;
608 struct hash_table_iter hti;
609 struct symtab_elt* ste;
611 if (dbghelp_options & SYMOPT_NO_PUBLICS) return TRUE;
613 /* FIXME: we're missing the ELF entry point here */
615 hash_table_iter_init(symtab, &hti, NULL);
616 while ((ste = hash_table_iter_up(&hti)))
618 /* FIXME: this is not a good idea anyway... we are creating several
619 * compiland objects for a same compilation unit
620 * We try to cache the last compiland used, but it's not enough
621 * (we should here only create compilands if they are not yet
622 * defined)
624 if (!compiland_name || compiland_name != ste->filename)
625 compiland = symt_new_compiland(module,
626 compiland_name = ste->filename);
628 symt_new_public(module, compiland, ste->ht_elt.name,
629 module->elf_info->elf_addr + ste->symp->st_value,
630 ste->symp->st_size, TRUE /* FIXME */,
631 ELF32_ST_TYPE(ste->symp->st_info) == STT_FUNC);
633 return TRUE;
636 /* Copyright (C) 1986 Gary S. Brown. Modified by Robert Shearman. You may use
637 the following calc_crc32 code or tables extracted from it, as desired without
638 restriction. */
640 /**********************************************************************\
641 |* Demonstration program to compute the 32-bit CRC used as the frame *|
642 |* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 *|
643 |* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level *|
644 |* protocol). The 32-bit FCS was added via the Federal Register, *|
645 |* 1 June 1982, p.23798. I presume but don't know for certain that *|
646 |* this polynomial is or will be included in CCITT V.41, which *|
647 |* defines the 16-bit CRC (often called CRC-CCITT) polynomial. FIPS *|
648 |* PUB 78 says that the 32-bit FCS reduces otherwise undetected *|
649 |* errors by a factor of 10^-5 over 16-bit FCS. *|
650 \**********************************************************************/
652 /* First, the polynomial itself and its table of feedback terms. The */
653 /* polynomial is */
654 /* 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 */
655 /* Note that we take it "backwards" and put the highest-order term in */
656 /* the lowest-order bit. The X^32 term is "implied"; the LSB is the */
657 /* X^31 term, etc. The X^0 term (usually shown as "+1") results in */
658 /* the MSB being 1. */
660 /* Note that the usual hardware shift register implementation, which */
661 /* is what we're using (we're merely optimizing it by doing eight-bit */
662 /* chunks at a time) shifts bits into the lowest-order term. In our */
663 /* implementation, that means shifting towards the right. Why do we */
664 /* do it this way? Because the calculated CRC must be transmitted in */
665 /* order from highest-order term to lowest-order term. UARTs transmit */
666 /* characters in order from LSB to MSB. By storing the CRC this way, */
667 /* we hand it to the UART in the order low-byte to high-byte; the UART */
668 /* sends each low-bit to hight-bit; and the result is transmission bit */
669 /* by bit from highest- to lowest-order term without requiring any bit */
670 /* shuffling on our part. Reception works similarly. */
672 /* The feedback terms table consists of 256, 32-bit entries. Notes: */
673 /* */
674 /* 1. The table can be generated at runtime if desired; code to do so */
675 /* is shown later. It might not be obvious, but the feedback */
676 /* terms simply represent the results of eight shift/xor opera- */
677 /* tions for all combinations of data and CRC register values. */
678 /* */
679 /* 2. The CRC accumulation logic is the same for all CRC polynomials, */
680 /* be they sixteen or thirty-two bits wide. You simply choose the */
681 /* appropriate table. Alternatively, because the table can be */
682 /* generated at runtime, you can start by generating the table for */
683 /* the polynomial in question and use exactly the same "updcrc", */
684 /* if your application needn't simultaneously handle two CRC */
685 /* polynomials. (Note, however, that XMODEM is strange.) */
686 /* */
687 /* 3. For 16-bit CRCs, the table entries need be only 16 bits wide; */
688 /* of course, 32-bit entries work OK if the high 16 bits are zero. */
689 /* */
690 /* 4. The values must be right-shifted by eight bits by the "updcrc" */
691 /* logic; the shift must be unsigned (bring in zeroes). On some */
692 /* hardware you could probably optimize the shift in assembler by */
693 /* using byte-swap instructions. */
696 static DWORD calc_crc32(struct elf_file_map* fmap)
698 #define UPDC32(octet,crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
699 static const DWORD crc_32_tab[] =
700 { /* CRC polynomial 0xedb88320 */
701 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
702 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
703 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
704 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
705 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
706 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
707 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
708 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
709 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
710 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
711 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
712 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
713 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
714 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
715 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
716 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
717 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
718 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
719 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
720 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
721 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
722 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
723 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
724 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
725 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
726 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
727 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
728 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
729 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
730 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
731 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
732 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
733 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
734 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
735 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
736 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
737 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
738 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
739 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
740 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
741 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
742 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
743 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
745 int i, r;
746 unsigned char buffer[256];
747 DWORD crc = ~0;
749 lseek(fmap->fd, 0, SEEK_SET);
750 while ((r = read(fmap->fd, buffer, sizeof(buffer))) > 0)
752 for (i = 0; i < r; i++) crc = UPDC32(buffer[i], crc);
754 return ~crc;
755 #undef UPDC32
758 /******************************************************************
759 * elf_load_debug_info_from_map
761 * Loads the symbolic information from ELF module which mapping is described
762 * in fmap
763 * the module has been loaded at 'load_offset' address, so symbols' address
764 * relocation is performed.
765 * CRC is checked if fmap->with_crc is TRUE
766 * returns
767 * 0 if the file doesn't contain symbolic info (or this info cannot be
768 * read or parsed)
769 * 1 on success
771 static BOOL elf_load_debug_info_from_map(struct module* module,
772 struct elf_file_map* fmap,
773 struct pool* pool,
774 struct hash_table* ht_symtab)
776 BOOL ret = FALSE;
777 const char* shstrtab;
778 int i;
779 int symtab_sect, dynsym_sect, stab_sect, stabstr_sect;
780 int debug_sect, debug_str_sect, debug_abbrev_sect, debug_line_sect;
781 int debuglink_sect;
782 struct thunk_area thunks[] =
784 {"__wine_spec_import_thunks", THUNK_ORDINAL_NOTYPE, 0, 0}, /* inter DLL calls */
785 {"__wine_spec_delayed_import_loaders", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
786 {"__wine_spec_delayed_import_thunks", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
787 {"__wine_delay_load", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
788 {"__wine_spec_thunk_text_16", -16, 0, 0}, /* 16 => 32 thunks */
789 {"__wine_spec_thunk_data_16", -16, 0, 0}, /* 16 => 32 thunks */
790 {"__wine_spec_thunk_text_32", -32, 0, 0}, /* 32 => 16 thunks */
791 {"__wine_spec_thunk_data_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 char* dw2_debug;
887 const char* dw2_debug_abbrev;
888 const char* dw2_debug_str;
890 FIXME("Alpha-support for Dwarf2 information for %s\n", module->module.ModuleName);
892 dw2_debug = elf_map_section(fmap, debug_sect);
893 dw2_debug_abbrev = elf_map_section(fmap, debug_abbrev_sect);
894 dw2_debug_str = 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,
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_search_and_load_file
1166 * lookup a file in standard ELF locations, and if found, load it
1168 static BOOL elf_search_and_load_file(struct process* pcs, const char* filename,
1169 unsigned long load_offset,
1170 struct elf_info* elf_info)
1172 BOOL ret = FALSE;
1173 struct module* module;
1175 if (filename == NULL || *filename == '\0') return FALSE;
1176 if ((module = module_find_by_name(pcs, filename, DMT_ELF)))
1178 elf_info->module = module;
1179 module->elf_info->elf_mark = 1;
1180 return module->module.SymType;
1183 if (strstr(filename, "libstdc++")) return FALSE; /* We know we can't do it */
1184 ret = elf_load_file(pcs, filename, load_offset, elf_info);
1185 /* if relative pathname, try some absolute base dirs */
1186 if (!ret && !strchr(filename, '/'))
1188 ret = elf_load_file_from_path(pcs, filename, load_offset,
1189 getenv("PATH"), elf_info) ||
1190 elf_load_file_from_path(pcs, filename, load_offset,
1191 getenv("LD_LIBRARY_PATH"), elf_info) ||
1192 elf_load_file_from_path(pcs, filename, load_offset,
1193 getenv("WINEDLLPATH"), elf_info);
1196 return ret;
1199 /******************************************************************
1200 * elf_enum_modules_internal
1202 * Enumerate ELF modules from a running process
1204 static BOOL elf_enum_modules_internal(const struct process* pcs,
1205 const char* main_name,
1206 elf_enum_modules_cb cb, void* user)
1208 struct r_debug dbg_hdr;
1209 void* lm_addr;
1210 struct link_map lm;
1211 char bufstr[256];
1213 if (!pcs->dbg_hdr_addr ||
1214 !ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr,
1215 &dbg_hdr, sizeof(dbg_hdr), NULL))
1216 return FALSE;
1218 /* Now walk the linked list. In all known ELF implementations,
1219 * the dynamic loader maintains this linked list for us. In some
1220 * cases the first entry doesn't appear with a name, in other cases it
1221 * does.
1223 for (lm_addr = (void*)dbg_hdr.r_map; lm_addr; lm_addr = (void*)lm.l_next)
1225 if (!ReadProcessMemory(pcs->handle, lm_addr, &lm, sizeof(lm), NULL))
1226 return FALSE;
1228 if (lm.l_prev != NULL && /* skip first entry, normally debuggee itself */
1229 lm.l_name != NULL &&
1230 ReadProcessMemory(pcs->handle, lm.l_name, bufstr, sizeof(bufstr), NULL))
1232 bufstr[sizeof(bufstr) - 1] = '\0';
1233 if (main_name && !bufstr[0]) strcpy(bufstr, main_name);
1234 if (!cb(bufstr, (unsigned long)lm.l_addr, user)) break;
1237 return TRUE;
1240 struct elf_sync
1242 struct process* pcs;
1243 struct elf_info elf_info;
1246 static BOOL elf_enum_sync_cb(const char* name, unsigned long addr, void* user)
1248 struct elf_sync* es = user;
1250 elf_search_and_load_file(es->pcs, name, addr, &es->elf_info);
1251 return TRUE;
1254 /******************************************************************
1255 * elf_synchronize_module_list
1257 * this functions rescans the debuggee module's list and synchronizes it with
1258 * the one from 'pcs', ie:
1259 * - if a module is in debuggee and not in pcs, it's loaded into pcs
1260 * - if a module is in pcs and not in debuggee, it's unloaded from pcs
1262 BOOL elf_synchronize_module_list(struct process* pcs)
1264 struct module* module;
1265 struct elf_sync es;
1267 for (module = pcs->lmodules; module; module = module->next)
1269 if (module->type == DMT_ELF) module->elf_info->elf_mark = 0;
1272 es.pcs = pcs;
1273 es.elf_info.flags = ELF_INFO_MODULE;
1274 if (!elf_enum_modules_internal(pcs, NULL, elf_enum_sync_cb, &es))
1275 return FALSE;
1277 module = pcs->lmodules;
1278 while (module)
1280 if (module->type == DMT_ELF && !module->elf_info->elf_mark &&
1281 !module->elf_info->elf_loader)
1283 module_remove(pcs, module);
1284 /* restart all over */
1285 module = pcs->lmodules;
1287 else module = module->next;
1289 return TRUE;
1292 /******************************************************************
1293 * elf_search_loader
1295 * Lookup in a running ELF process the loader, and sets its ELF link
1296 * address (for accessing the list of loaded .so libs) in pcs.
1297 * If flags is ELF_INFO_MODULE, the module for the loader is also
1298 * added as a module into pcs.
1300 static BOOL elf_search_loader(struct process* pcs, struct elf_info* elf_info)
1302 BOOL ret;
1303 const char* ptr;
1305 /* All binaries are loaded with WINELOADER (if run from tree) or by the
1306 * main executable (either wine-kthread or wine-pthread)
1307 * FIXME: the heuristic used to know whether we need to load wine-pthread
1308 * or wine-kthread is not 100% safe
1310 if ((ptr = getenv("WINELOADER")))
1311 ret = elf_search_and_load_file(pcs, ptr, 0, elf_info);
1312 else
1314 ret = elf_search_and_load_file(pcs, "wine-kthread", 0, elf_info) ||
1315 elf_search_and_load_file(pcs, "wine-pthread", 0, elf_info);
1317 return ret;
1320 /******************************************************************
1321 * elf_read_wine_loader_dbg_info
1323 * Try to find a decent wine executable which could have loaded the debuggee
1325 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1327 struct elf_info elf_info;
1329 elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_MODULE;
1330 if (!elf_search_loader(pcs, &elf_info)) return FALSE;
1331 elf_info.module->elf_info->elf_loader = 1;
1332 strcpy(elf_info.module->module.ModuleName, "<wine-loader>");
1333 return (pcs->dbg_hdr_addr = elf_info.dbg_hdr_addr) != 0;
1336 /******************************************************************
1337 * elf_enum_modules
1339 * Enumerates the ELF loaded modules from a running target (hProc)
1340 * This function doesn't require that someone has called SymInitialize
1341 * on this very process.
1343 BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb cb, void* user)
1345 struct process pcs;
1346 struct elf_info elf_info;
1347 BOOL ret;
1349 memset(&pcs, 0, sizeof(pcs));
1350 pcs.handle = hProc;
1351 elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_NAME;
1352 if (!elf_search_loader(&pcs, &elf_info)) return FALSE;
1353 pcs.dbg_hdr_addr = elf_info.dbg_hdr_addr;
1354 ret = elf_enum_modules_internal(&pcs, elf_info.module_name, cb, user);
1355 HeapFree(GetProcessHeap(), 0, (char*)elf_info.module_name);
1356 return ret;
1359 struct elf_load
1361 struct process* pcs;
1362 struct elf_info elf_info;
1363 const char* name;
1364 BOOL ret;
1367 /******************************************************************
1368 * elf_load_cb
1370 * Callback for elf_load_module, used to walk the list of loaded
1371 * modules.
1373 static BOOL elf_load_cb(const char* name, unsigned long addr, void* user)
1375 struct elf_load* el = user;
1376 const char* p;
1378 /* memcmp is needed for matches when bufstr contains also version information
1379 * el->name: libc.so, name: libc.so.6.0
1381 p = strrchr(name, '/');
1382 if (!p++) p = name;
1383 if (!memcmp(p, el->name, strlen(el->name)))
1385 elf_search_and_load_file(el->pcs, name, addr, &el->elf_info);
1386 return FALSE;
1388 return TRUE;
1391 /******************************************************************
1392 * elf_load_module
1394 * loads an ELF module and stores it in process' module list
1395 * Also, find module real name and load address from
1396 * the real loaded modules list in pcs address space
1398 struct module* elf_load_module(struct process* pcs, const char* name, DWORD addr)
1400 struct elf_load el;
1402 TRACE("(%p %s %08lx)\n", pcs, name, addr);
1404 el.elf_info.flags = ELF_INFO_MODULE;
1405 el.ret = FALSE;
1407 if (pcs->dbg_hdr_addr) /* we're debugging a life target */
1409 el.pcs = pcs;
1410 /* do only the lookup from the filename, not the path (as we lookup module
1411 * name in the process' loaded module list)
1413 el.name = strrchr(name, '/');
1414 if (!el.name++) el.name = name;
1415 el.ret = FALSE;
1417 if (!elf_enum_modules_internal(pcs, NULL, elf_load_cb, &el))
1418 return NULL;
1420 else if (addr)
1422 el.ret = elf_search_and_load_file(pcs, name, addr, &el.elf_info);
1424 if (!el.ret) return NULL;
1425 assert(el.elf_info.module);
1426 return el.elf_info.module;
1429 #else /* !__ELF__ */
1431 BOOL elf_synchronize_module_list(struct process* pcs)
1433 return FALSE;
1436 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1438 return FALSE;
1441 struct module* elf_load_module(struct process* pcs, const char* name, DWORD addr)
1443 return NULL;
1446 BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
1448 return FALSE;
1450 #endif /* __ELF__ */