oleaut32: Include minimal ungif source to remove dependency on libungif.
[wine/testsucceed.git] / dlls / dbghelp / elf_module.c
bloba5098480f49cbfaeded0816ed2c2e3fc1e4710c9
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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "config.h"
23 #include "wine/port.h"
25 #if defined(__svr4__) || defined(__sun)
26 #define __ELF__
27 /* large files are not supported by libelf */
28 #undef _FILE_OFFSET_BITS
29 #define _FILE_OFFSET_BITS 32
30 #endif
32 #include <assert.h>
33 #include <stdio.h>
34 #include <stdlib.h>
35 #ifdef HAVE_SYS_STAT_H
36 # include <sys/stat.h>
37 #endif
38 #include <fcntl.h>
39 #ifdef HAVE_SYS_MMAN_H
40 #include <sys/mman.h>
41 #endif
42 #ifdef HAVE_UNISTD_H
43 # include <unistd.h>
44 #endif
45 #ifndef PATH_MAX
46 #define PATH_MAX MAX_PATH
47 #endif
49 #include "dbghelp_private.h"
51 #ifdef HAVE_ELF_H
52 # include <elf.h>
53 #endif
54 #ifdef HAVE_SYS_ELF32_H
55 # include <sys/elf32.h>
56 #endif
57 #ifdef HAVE_SYS_EXEC_ELF_H
58 # include <sys/exec_elf.h>
59 #endif
60 #if !defined(DT_NUM)
61 # if defined(DT_COUNT)
62 # define DT_NUM DT_COUNT
63 # else
64 /* this seems to be a satisfactory value on Solaris, which doesn't support this AFAICT */
65 # define DT_NUM 24
66 # endif
67 #endif
68 #ifdef HAVE_LINK_H
69 # include <link.h>
70 #endif
71 #ifdef HAVE_SYS_LINK_H
72 # include <sys/link.h>
73 #endif
75 #include "wine/library.h"
76 #include "wine/debug.h"
78 WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
80 struct elf_module_info
82 unsigned long elf_addr;
83 unsigned short elf_mark : 1,
84 elf_loader : 1;
87 #ifdef __ELF__
89 #define ELF_INFO_DEBUG_HEADER 0x0001
90 #define ELF_INFO_MODULE 0x0002
91 #define ELF_INFO_NAME 0x0004
93 struct elf_info
95 unsigned flags; /* IN one (or several) of the ELF_INFO constants */
96 unsigned long dbg_hdr_addr; /* OUT address of debug header (if ELF_INFO_DEBUG_HEADER is set) */
97 struct module* module; /* OUT loaded module (if ELF_INFO_MODULE is set) */
98 const char* module_name; /* OUT found module name (if ELF_INFO_NAME is set) */
101 #define NO_MAP ((const void*)0xffffffff)
102 /* structure holding information while handling an ELF image
103 * allows one by one section mapping for memory savings
105 struct elf_file_map
107 Elf32_Ehdr elfhdr;
108 size_t elf_size;
109 size_t elf_start;
110 struct
112 Elf32_Shdr shdr;
113 const char* mapped;
114 }* sect;
115 int fd;
116 unsigned with_crc;
117 unsigned long crc;
120 struct symtab_elt
122 struct hash_table_elt ht_elt;
123 const Elf32_Sym* symp;
124 struct symt_compiland* compiland;
125 unsigned used;
128 struct elf_thunk_area
130 const char* symname;
131 THUNK_ORDINAL ordinal;
132 unsigned long rva_start;
133 unsigned long rva_end;
136 /******************************************************************
137 * elf_map_section
139 * Maps a single section into memory from an ELF file
141 static const char* elf_map_section(struct elf_file_map* fmap, int sidx)
143 unsigned pgsz = getpagesize();
144 unsigned ofst, size;
146 if (sidx < 0 || sidx >= fmap->elfhdr.e_shnum ||
147 fmap->sect[sidx].shdr.sh_type == SHT_NOBITS)
148 return NO_MAP;
149 /* align required information on page size (we assume pagesize is a power of 2) */
150 ofst = fmap->sect[sidx].shdr.sh_offset & ~(pgsz - 1);
151 size = (fmap->sect[sidx].shdr.sh_offset +
152 fmap->sect[sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1);
153 fmap->sect[sidx].mapped = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fmap->fd, ofst);
154 if (fmap->sect[sidx].mapped == NO_MAP) return NO_MAP;
155 return fmap->sect[sidx].mapped + (fmap->sect[sidx].shdr.sh_offset & (pgsz - 1));
158 /******************************************************************
159 * elf_unmap_section
161 * Unmaps a single section from memory
163 static void elf_unmap_section(struct elf_file_map* fmap, int sidx)
165 if (sidx < fmap->elfhdr.e_shnum && fmap->sect[sidx].mapped != NO_MAP)
167 munmap((char*)fmap->sect[sidx].mapped, fmap->sect[sidx].shdr.sh_size);
168 fmap->sect[sidx].mapped = NO_MAP;
172 /******************************************************************
173 * elf_map_file
175 * Maps an ELF file into memory (and checks it's a real ELF file)
177 static BOOL elf_map_file(const char* filename, struct elf_file_map* fmap)
179 static const BYTE elf_signature[4] = { ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3 };
180 struct stat statbuf;
181 int i;
182 Elf32_Phdr phdr;
183 unsigned tmp, page_mask = getpagesize() - 1;
186 fmap->fd = -1;
187 fmap->with_crc = 0;
189 /* check that the file exists, and that the module hasn't been loaded yet */
190 if (stat(filename, &statbuf) == -1 || S_ISDIR(statbuf.st_mode)) return FALSE;
192 /* Now open the file, so that we can mmap() it. */
193 if ((fmap->fd = open(filename, O_RDONLY)) == -1) return FALSE;
195 if (read(fmap->fd, &fmap->elfhdr, sizeof(fmap->elfhdr)) != sizeof(fmap->elfhdr))
196 return FALSE;
197 /* and check for an ELF header */
198 if (memcmp(fmap->elfhdr.e_ident,
199 elf_signature, sizeof(elf_signature))) return FALSE;
201 fmap->sect = HeapAlloc(GetProcessHeap(), 0,
202 fmap->elfhdr.e_shnum * sizeof(fmap->sect[0]));
203 if (!fmap->sect) return FALSE;
205 lseek(fmap->fd, fmap->elfhdr.e_shoff, SEEK_SET);
206 for (i = 0; i < fmap->elfhdr.e_shnum; i++)
208 read(fmap->fd, &fmap->sect[i].shdr, sizeof(fmap->sect[i].shdr));
209 fmap->sect[i].mapped = NO_MAP;
212 /* grab size of module once loaded in memory */
213 lseek(fmap->fd, fmap->elfhdr.e_phoff, SEEK_SET);
214 fmap->elf_size = 0;
215 fmap->elf_start = ~0L;
216 for (i = 0; i < fmap->elfhdr.e_phnum; i++)
218 if (read(fmap->fd, &phdr, sizeof(phdr)) == sizeof(phdr) &&
219 phdr.p_type == PT_LOAD)
221 tmp = (phdr.p_vaddr + phdr.p_memsz + page_mask) & ~page_mask;
222 if (fmap->elf_size < tmp) fmap->elf_size = tmp;
223 if (phdr.p_vaddr < fmap->elf_start) fmap->elf_start = phdr.p_vaddr;
226 /* if non relocatable ELF, then remove fixed address from computation
227 * otherwise, all addresses are zero based and start has no effect
229 fmap->elf_size -= fmap->elf_start;
230 return TRUE;
233 /******************************************************************
234 * elf_unmap_file
236 * Unmaps an ELF file from memory (previously mapped with elf_map_file)
238 static void elf_unmap_file(struct elf_file_map* fmap)
240 if (fmap->fd != -1)
242 int i;
243 for (i = 0; i < fmap->elfhdr.e_shnum; i++)
245 elf_unmap_section(fmap, i);
247 HeapFree(GetProcessHeap(), 0, fmap->sect);
248 close(fmap->fd);
252 /******************************************************************
253 * elf_is_in_thunk_area
255 * Check whether an address lies within one of the thunk area we
256 * know of.
258 int elf_is_in_thunk_area(unsigned long addr,
259 const struct elf_thunk_area* thunks)
261 unsigned i;
263 for (i = 0; thunks[i].symname; i++)
265 if (addr >= thunks[i].rva_start && addr < thunks[i].rva_end)
266 return i;
268 return -1;
271 /******************************************************************
272 * elf_hash_symtab
274 * creating an internal hash table to ease use ELF symtab information lookup
276 static void elf_hash_symtab(struct module* module, struct pool* pool,
277 struct hash_table* ht_symtab, struct elf_file_map* fmap,
278 int symtab_idx, struct elf_thunk_area* thunks)
280 int i, j, nsym;
281 const char* strp;
282 const char* symname;
283 struct symt_compiland* compiland = NULL;
284 const char* ptr;
285 const Elf32_Sym* symp;
286 struct symtab_elt* ste;
288 symp = (const Elf32_Sym*)elf_map_section(fmap, symtab_idx);
289 strp = elf_map_section(fmap, fmap->sect[symtab_idx].shdr.sh_link);
290 if (symp == NO_MAP || strp == NO_MAP) return;
292 nsym = fmap->sect[symtab_idx].shdr.sh_size / sizeof(*symp);
294 for (j = 0; thunks[j].symname; j++)
295 thunks[j].rva_start = thunks[j].rva_end = 0;
297 for (i = 0; i < nsym; i++, symp++)
299 /* Ignore certain types of entries which really aren't of that much
300 * interest.
302 if ((ELF32_ST_TYPE(symp->st_info) != STT_NOTYPE &&
303 ELF32_ST_TYPE(symp->st_info) != STT_FILE &&
304 ELF32_ST_TYPE(symp->st_info) != STT_OBJECT &&
305 ELF32_ST_TYPE(symp->st_info) != STT_FUNC) ||
306 symp->st_shndx == SHN_UNDEF)
308 continue;
311 symname = strp + symp->st_name;
313 /* handle some specific symtab (that we'll throw away when done) */
314 switch (ELF32_ST_TYPE(symp->st_info))
316 case STT_FILE:
317 compiland = symname ? symt_new_compiland(module, source_new(module, NULL, symname)) : NULL;
318 continue;
319 case STT_NOTYPE:
320 /* we are only interested in wine markers inserted by winebuild */
321 for (j = 0; thunks[j].symname; j++)
323 if (!strcmp(symname, thunks[j].symname))
325 thunks[j].rva_start = symp->st_value;
326 thunks[j].rva_end = symp->st_value + symp->st_size;
327 break;
330 continue;
333 /* FIXME: we don't need to handle them (GCC internals)
334 * Moreover, they screw up our symbol lookup :-/
336 if (symname[0] == '.' && symname[1] == 'L' && isdigit(symname[2]))
337 continue;
339 ste = pool_alloc(pool, sizeof(*ste));
340 ste->ht_elt.name = symname;
341 /* GCC emits, in some cases, a .<digit>+ suffix.
342 * This is used for static variable inside functions, so
343 * that we can have several such variables with same name in
344 * the same compilation unit
345 * We simply ignore that suffix when present (we also get rid
346 * of it in stabs parsing)
348 ptr = symname + strlen(symname) - 1;
349 if (isdigit(*ptr))
351 while (isdigit(*ptr) && ptr >= symname) ptr--;
352 if (ptr > symname && *ptr == '.')
354 char* n = pool_alloc(pool, ptr - symname + 1);
355 memcpy(n, symname, ptr - symname + 1);
356 n[ptr - symname] = '\0';
357 ste->ht_elt.name = n;
360 ste->symp = symp;
361 ste->compiland = compiland;
362 ste->used = 0;
363 hash_table_add(ht_symtab, &ste->ht_elt);
365 /* as we added in the ht_symtab pointers to the symbols themselves,
366 * we cannot unmap yet the sections, it will be done when we're over
367 * with this ELF file
371 /******************************************************************
372 * elf_lookup_symtab
374 * lookup a symbol by name in our internal hash table for the symtab
376 static const Elf32_Sym* elf_lookup_symtab(const struct module* module,
377 const struct hash_table* ht_symtab,
378 const char* name, struct symt* compiland)
380 struct symtab_elt* weak_result = NULL; /* without compiland name */
381 struct symtab_elt* result = NULL;
382 struct hash_table_iter hti;
383 struct symtab_elt* ste;
384 const char* compiland_name;
385 const char* compiland_basename;
386 const char* base;
388 /* we need weak match up (at least) when symbols of same name,
389 * defined several times in different compilation units,
390 * are merged in a single one (hence a different filename for c.u.)
392 if (compiland)
394 compiland_name = source_get(module,
395 ((struct symt_compiland*)compiland)->source);
396 compiland_basename = strrchr(compiland_name, '/');
397 if (!compiland_basename++) compiland_basename = compiland_name;
399 else compiland_name = compiland_basename = NULL;
401 hash_table_iter_init(ht_symtab, &hti, name);
402 while ((ste = hash_table_iter_up(&hti)))
404 if (ste->used || strcmp(ste->ht_elt.name, name)) continue;
406 weak_result = ste;
407 if ((ste->compiland && !compiland_name) || (!ste->compiland && compiland_name))
408 continue;
409 if (ste->compiland && compiland_name)
411 const char* filename = source_get(module, ste->compiland->source);
412 if (strcmp(filename, compiland_name))
414 base = strrchr(filename, '/');
415 if (!base++) base = filename;
416 if (strcmp(base, compiland_basename)) continue;
419 if (result)
421 FIXME("Already found symbol %s (%s) in symtab %s @%08x and %s @%08x\n",
422 name, compiland_name,
423 source_get(module, result->compiland->source), result->symp->st_value,
424 source_get(module, ste->compiland->source), ste->symp->st_value);
426 else
428 result = ste;
429 ste->used = 1;
432 if (!result && !(result = weak_result))
434 FIXME("Couldn't find symbol %s!%s in symtab\n",
435 module->module.ModuleName, name);
436 return NULL;
438 return result->symp;
441 /******************************************************************
442 * elf_finish_stabs_info
444 * - get any relevant information (address & size) from the bits we got from the
445 * stabs debugging information
447 static void elf_finish_stabs_info(struct module* module, struct hash_table* symtab)
449 struct hash_table_iter hti;
450 void* ptr;
451 struct symt_ht* sym;
452 const Elf32_Sym* symp;
454 hash_table_iter_init(&module->ht_symbols, &hti, NULL);
455 while ((ptr = hash_table_iter_up(&hti)))
457 sym = GET_ENTRY(ptr, struct symt_ht, hash_elt);
458 switch (sym->symt.tag)
460 case SymTagFunction:
461 if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
462 ((struct symt_function*)sym)->size)
464 break;
466 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name,
467 ((struct symt_function*)sym)->container);
468 if (symp)
470 if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
471 ((struct symt_function*)sym)->address != module->elf_info->elf_addr + symp->st_value)
472 FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
473 sym, module->module.ModuleName, sym->hash_elt.name,
474 ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
475 if (((struct symt_function*)sym)->size && ((struct symt_function*)sym)->size != symp->st_size)
476 FIXME("Changing size for %p/%s!%s from %08lx to %08x\n",
477 sym, module->module.ModuleName, sym->hash_elt.name,
478 ((struct symt_function*)sym)->size, symp->st_size);
480 ((struct symt_function*)sym)->address = module->elf_info->elf_addr +
481 symp->st_value;
482 ((struct symt_function*)sym)->size = symp->st_size;
483 } else FIXME("Couldn't find %s!%s\n", module->module.ModuleName, sym->hash_elt.name);
484 break;
485 case SymTagData:
486 switch (((struct symt_data*)sym)->kind)
488 case DataIsGlobal:
489 case DataIsFileStatic:
490 if (((struct symt_data*)sym)->u.address != module->elf_info->elf_addr)
491 break;
492 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name,
493 ((struct symt_data*)sym)->container);
494 if (symp)
496 if (((struct symt_data*)sym)->u.address != module->elf_info->elf_addr &&
497 ((struct symt_data*)sym)->u.address != module->elf_info->elf_addr + symp->st_value)
498 FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
499 sym, module->module.ModuleName, sym->hash_elt.name,
500 ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
501 ((struct symt_data*)sym)->u.address = module->elf_info->elf_addr +
502 symp->st_value;
503 ((struct symt_data*)sym)->kind = (ELF32_ST_BIND(symp->st_info) == STB_LOCAL) ?
504 DataIsFileStatic : DataIsGlobal;
505 } else FIXME("Couldn't find %s!%s\n", module->module.ModuleName, sym->hash_elt.name);
506 break;
507 default:;
509 break;
510 default:
511 FIXME("Unsupported tag %u\n", sym->symt.tag);
512 break;
515 /* since we may have changed some addresses & sizes, mark the module to be resorted */
516 module->sortlist_valid = FALSE;
519 /******************************************************************
520 * elf_load_wine_thunks
522 * creating the thunk objects for a wine native DLL
524 static int elf_new_wine_thunks(struct module* module, struct hash_table* ht_symtab,
525 const struct elf_thunk_area* thunks)
527 int j;
528 struct hash_table_iter hti;
529 struct symtab_elt* ste;
530 DWORD addr;
531 int idx;
533 hash_table_iter_init(ht_symtab, &hti, NULL);
534 while ((ste = hash_table_iter_up(&hti)))
536 if (ste->used) continue;
538 addr = module->elf_info->elf_addr + ste->symp->st_value;
540 j = elf_is_in_thunk_area(ste->symp->st_value, thunks);
541 if (j >= 0) /* thunk found */
543 symt_new_thunk(module, ste->compiland, ste->ht_elt.name, thunks[j].ordinal,
544 addr, ste->symp->st_size);
546 else
548 ULONG64 ref_addr;
550 idx = symt_find_nearest(module, addr);
551 if (idx != -1)
552 symt_get_info(&module->addr_sorttab[idx]->symt,
553 TI_GET_ADDRESS, &ref_addr);
554 if (idx == -1 || addr != ref_addr)
556 /* creating public symbols for all the ELF symbols which haven't been
557 * used yet (ie we have no debug information on them)
558 * That's the case, for example, of the .spec.c files
560 switch (ELF32_ST_TYPE(ste->symp->st_info))
562 case STT_FUNC:
563 symt_new_function(module, ste->compiland, ste->ht_elt.name,
564 addr, ste->symp->st_size, NULL);
565 break;
566 case STT_OBJECT:
567 symt_new_global_variable(module, ste->compiland, ste->ht_elt.name,
568 ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL,
569 addr, ste->symp->st_size, NULL);
570 break;
571 default:
572 FIXME("Shouldn't happen\n");
573 break;
575 /* FIXME: this is a hack !!!
576 * we are adding new symbols, but as we're parsing a symbol table
577 * (hopefully without duplicate symbols) we delay rebuilding the sorted
578 * module table until we're done with the symbol table
579 * Otherwise, as we intertwine symbols's add and lookup, performance
580 * is rather bad
582 module->sortlist_valid = TRUE;
584 else if (strcmp(ste->ht_elt.name, module->addr_sorttab[idx]->hash_elt.name))
586 ULONG64 xaddr = 0, xsize = 0;
587 DWORD kind = -1;
589 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_ADDRESS, &xaddr);
590 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_LENGTH, &xsize);
591 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_DATAKIND, &kind);
593 /* If none of symbols has a correct size, we consider they are both markers
594 * Hence, we can silence this warning
595 * Also, we check that we don't have two symbols, one local, the other
596 * global which is legal
598 if ((xsize || ste->symp->st_size) &&
599 (kind == (ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL) ? DataIsFileStatic : DataIsGlobal))
600 FIXME("Duplicate in %s: %s<%08lx-%08x> %s<%s-%s>\n",
601 module->module.ModuleName,
602 ste->ht_elt.name, addr, ste->symp->st_size,
603 module->addr_sorttab[idx]->hash_elt.name,
604 wine_dbgstr_longlong(xaddr), wine_dbgstr_longlong(xsize));
608 /* see comment above */
609 module->sortlist_valid = FALSE;
610 return TRUE;
613 /******************************************************************
614 * elf_new_public_symbols
616 * Creates a set of public symbols from an ELF symtab
618 static int elf_new_public_symbols(struct module* module, struct hash_table* symtab)
620 struct hash_table_iter hti;
621 struct symtab_elt* ste;
623 if (dbghelp_options & SYMOPT_NO_PUBLICS) return TRUE;
625 /* FIXME: we're missing the ELF entry point here */
627 hash_table_iter_init(symtab, &hti, NULL);
628 while ((ste = hash_table_iter_up(&hti)))
630 symt_new_public(module, ste->compiland, ste->ht_elt.name,
631 module->elf_info->elf_addr + ste->symp->st_value,
632 ste->symp->st_size, TRUE /* FIXME */,
633 ELF32_ST_TYPE(ste->symp->st_info) == STT_FUNC);
635 return TRUE;
638 /* Copyright (C) 1986 Gary S. Brown. Modified by Robert Shearman. You may use
639 the following calc_crc32 code or tables extracted from it, as desired without
640 restriction. */
642 /**********************************************************************\
643 |* Demonstration program to compute the 32-bit CRC used as the frame *|
644 |* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 *|
645 |* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level *|
646 |* protocol). The 32-bit FCS was added via the Federal Register, *|
647 |* 1 June 1982, p.23798. I presume but don't know for certain that *|
648 |* this polynomial is or will be included in CCITT V.41, which *|
649 |* defines the 16-bit CRC (often called CRC-CCITT) polynomial. FIPS *|
650 |* PUB 78 says that the 32-bit FCS reduces otherwise undetected *|
651 |* errors by a factor of 10^-5 over 16-bit FCS. *|
652 \**********************************************************************/
654 /* First, the polynomial itself and its table of feedback terms. The */
655 /* polynomial is */
656 /* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */
657 /* Note that we take it "backwards" and put the highest-order term in */
658 /* the lowest-order bit. The X^32 term is "implied"; the LSB is the */
659 /* X^31 term, etc. The X^0 term (usually shown as "+1") results in */
660 /* the MSB being 1. */
662 /* Note that the usual hardware shift register implementation, which */
663 /* is what we're using (we're merely optimizing it by doing eight-bit */
664 /* chunks at a time) shifts bits into the lowest-order term. In our */
665 /* implementation, that means shifting towards the right. Why do we */
666 /* do it this way? Because the calculated CRC must be transmitted in */
667 /* order from highest-order term to lowest-order term. UARTs transmit */
668 /* characters in order from LSB to MSB. By storing the CRC this way, */
669 /* we hand it to the UART in the order low-byte to high-byte; the UART */
670 /* sends each low-bit to hight-bit; and the result is transmission bit */
671 /* by bit from highest- to lowest-order term without requiring any bit */
672 /* shuffling on our part. Reception works similarly. */
674 /* The feedback terms table consists of 256, 32-bit entries. Notes: */
675 /* */
676 /* 1. The table can be generated at runtime if desired; code to do so */
677 /* is shown later. It might not be obvious, but the feedback */
678 /* terms simply represent the results of eight shift/xor opera- */
679 /* tions for all combinations of data and CRC register values. */
680 /* */
681 /* 2. The CRC accumulation logic is the same for all CRC polynomials, */
682 /* be they sixteen or thirty-two bits wide. You simply choose the */
683 /* appropriate table. Alternatively, because the table can be */
684 /* generated at runtime, you can start by generating the table for */
685 /* the polynomial in question and use exactly the same "updcrc", */
686 /* if your application needn't simultaneously handle two CRC */
687 /* polynomials. (Note, however, that XMODEM is strange.) */
688 /* */
689 /* 3. For 16-bit CRCs, the table entries need be only 16 bits wide; */
690 /* of course, 32-bit entries work OK if the high 16 bits are zero. */
691 /* */
692 /* 4. The values must be right-shifted by eight bits by the "updcrc" */
693 /* logic; the shift must be unsigned (bring in zeroes). On some */
694 /* hardware you could probably optimize the shift in assembler by */
695 /* using byte-swap instructions. */
698 static DWORD calc_crc32(struct elf_file_map* fmap)
700 #define UPDC32(octet,crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
701 static const DWORD crc_32_tab[] =
702 { /* CRC polynomial 0xedb88320 */
703 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
704 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
705 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
706 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
707 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
708 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
709 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
710 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
711 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
712 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
713 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
714 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
715 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
716 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
717 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
718 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
719 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
720 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
721 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
722 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
723 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
724 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
725 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
726 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
727 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
728 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
729 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
730 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
731 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
732 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
733 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
734 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
735 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
736 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
737 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
738 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
739 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
740 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
741 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
742 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
743 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
744 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
745 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
747 int i, r;
748 unsigned char buffer[256];
749 DWORD crc = ~0;
751 lseek(fmap->fd, 0, SEEK_SET);
752 while ((r = read(fmap->fd, buffer, sizeof(buffer))) > 0)
754 for (i = 0; i < r; i++) crc = UPDC32(buffer[i], crc);
756 return ~crc;
757 #undef UPDC32
760 /******************************************************************
761 * elf_load_debug_info_from_map
763 * Loads the symbolic information from ELF module which mapping is described
764 * in fmap
765 * the module has been loaded at 'load_offset' address, so symbols' address
766 * relocation is performed.
767 * CRC is checked if fmap->with_crc is TRUE
768 * returns
769 * 0 if the file doesn't contain symbolic info (or this info cannot be
770 * read or parsed)
771 * 1 on success
773 static BOOL elf_load_debug_info_from_map(struct module* module,
774 struct elf_file_map* fmap,
775 struct pool* pool,
776 struct hash_table* ht_symtab)
778 BOOL ret = FALSE, lret;
779 const char* shstrtab;
780 int i;
781 int symtab_sect, dynsym_sect, stab_sect, stabstr_sect;
782 int debug_sect, debug_str_sect, debug_abbrev_sect, debug_line_sect;
783 int debuglink_sect;
784 struct elf_thunk_area thunks[] =
786 {"__wine_spec_import_thunks", THUNK_ORDINAL_NOTYPE, 0, 0}, /* inter DLL calls */
787 {"__wine_spec_delayed_import_loaders", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
788 {"__wine_spec_delayed_import_thunks", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
789 {"__wine_delay_load", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
790 {"__wine_spec_thunk_text_16", -16, 0, 0}, /* 16 => 32 thunks */
791 {"__wine_spec_thunk_text_32", -32, 0, 0}, /* 32 => 16 thunks */
792 {NULL, 0, 0, 0}
795 if (fmap->with_crc && (fmap->crc != calc_crc32(fmap)))
797 ERR("Bad CRC for module %s (got %08lx while expecting %08lx)\n",
798 module->module.ImageName, calc_crc32(fmap), fmap->crc);
799 /* we don't tolerate mis-matched files */
800 return FALSE;
804 * Next, we need to find a few of the internal ELF headers within
805 * this thing. We need the main executable header, and the section
806 * table.
808 shstrtab = elf_map_section(fmap, fmap->elfhdr.e_shstrndx);
809 if (shstrtab == NO_MAP) return FALSE;
811 symtab_sect = dynsym_sect = stab_sect = stabstr_sect = -1;
812 debug_sect = debug_str_sect = debug_abbrev_sect = debug_line_sect = -1;
813 debuglink_sect = -1;
815 for (i = 0; i < fmap->elfhdr.e_shnum; i++)
817 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".stab") == 0)
818 stab_sect = i;
819 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".stabstr") == 0)
820 stabstr_sect = i;
821 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_info") == 0)
822 debug_sect = i;
823 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_str") == 0)
824 debug_str_sect = i;
825 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_abbrev") == 0)
826 debug_abbrev_sect = i;
827 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_line") == 0)
828 debug_line_sect = i;
829 if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".gnu_debuglink") == 0)
830 debuglink_sect = i;
831 if ((strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".symtab") == 0) &&
832 (fmap->sect[i].shdr.sh_type == SHT_SYMTAB))
833 symtab_sect = i;
834 if ((strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".dynsym") == 0) &&
835 (fmap->sect[i].shdr.sh_type == SHT_DYNSYM))
836 dynsym_sect = i;
838 elf_unmap_section(fmap, fmap->elfhdr.e_shstrndx);
839 shstrtab = NULL;
841 if (symtab_sect == -1)
843 /* if we don't have a symtab but a dynsym, process the dynsym
844 * section instead. It'll contain less (relevant) information,
845 * but it'll be better than nothing
847 if (dynsym_sect == -1) return FALSE;
848 symtab_sect = dynsym_sect;
851 module->module.SymType = SymExport;
853 /* create a hash table for the symtab */
854 elf_hash_symtab(module, pool, ht_symtab, fmap, symtab_sect, thunks);
856 if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
858 if (stab_sect != -1 && stabstr_sect != -1)
860 const char* stab;
861 const char* stabstr;
863 stab = elf_map_section(fmap, stab_sect);
864 stabstr = elf_map_section(fmap, stabstr_sect);
865 if (stab != NO_MAP && stabstr != NO_MAP)
867 /* OK, now just parse all of the stabs. */
868 lret = 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);
871 if (lret)
872 /* and fill in the missing information for stabs */
873 elf_finish_stabs_info(module, ht_symtab);
874 else
875 WARN("Couldn't correctly read stabs\n");
876 ret = ret || lret;
878 else lret = FALSE;
879 elf_unmap_section(fmap, stab_sect);
880 elf_unmap_section(fmap, stabstr_sect);
883 if (debug_sect != -1)
885 /* Dwarf 2 debug information */
886 const BYTE* dw2_debug;
887 const BYTE* dw2_debug_abbrev;
888 const BYTE* dw2_debug_str;
889 const BYTE* dw2_debug_line;
891 FIXME("Alpha-support for Dwarf2 information for %s\n", module->module.ModuleName);
893 dw2_debug = (const BYTE*) elf_map_section(fmap, debug_sect);
894 dw2_debug_abbrev = (const BYTE*) elf_map_section(fmap, debug_abbrev_sect);
895 dw2_debug_str = (const BYTE*) elf_map_section(fmap, debug_str_sect);
896 dw2_debug_line = (const BYTE*) elf_map_section(fmap, debug_line_sect);
897 if (dw2_debug != NO_MAP && NO_MAP != dw2_debug_abbrev && dw2_debug_str != NO_MAP)
899 /* OK, now just parse dwarf2 debug infos. */
900 lret = dwarf2_parse(module, module->elf_info->elf_addr, thunks,
901 dw2_debug, fmap->sect[debug_sect].shdr.sh_size,
902 dw2_debug_abbrev, fmap->sect[debug_abbrev_sect].shdr.sh_size,
903 dw2_debug_str, fmap->sect[debug_str_sect].shdr.sh_size,
904 dw2_debug_line, fmap->sect[debug_line_sect].shdr.sh_size);
905 if (!lret)
906 WARN("Couldn't correctly read stabs\n");
907 ret = ret || lret;
909 elf_unmap_section(fmap, debug_sect);
910 elf_unmap_section(fmap, debug_abbrev_sect);
911 elf_unmap_section(fmap, debug_str_sect);
912 elf_unmap_section(fmap, debug_line_sect);
914 if (debuglink_sect != -1)
916 const char* dbg_link;
917 struct elf_file_map fmap_link;
919 dbg_link = elf_map_section(fmap, debuglink_sect);
920 /* The content of a debug link section is:
921 * 1/ a NULL terminated string, containing the file name for the
922 * debug info
923 * 2/ padding on 4 byte boundary
924 * 3/ CRC of the linked ELF file
926 if (dbg_link != NO_MAP && elf_map_file(dbg_link, &fmap_link))
928 fmap_link.crc = *(const DWORD*)(dbg_link + ((DWORD_PTR)(strlen(dbg_link) + 4) & ~3));
929 fmap_link.with_crc = 1;
930 lret = elf_load_debug_info_from_map(module, &fmap_link, pool,
931 ht_symtab);
932 if (lret)
933 strcpy(module->module.LoadedPdbName, dbg_link);
934 else
935 WARN("Couldn't load debug information from %s\n", dbg_link);
936 ret = ret || lret;
938 else
939 WARN("Couldn't load linked debug file for %s\n",
940 module->module.ModuleName);
941 elf_unmap_file(&fmap_link);
944 if (strstr(module->module.ModuleName, "<elf>") ||
945 !strcmp(module->module.ModuleName, "<wine-loader>"))
947 /* add the thunks for native libraries */
948 if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
949 elf_new_wine_thunks(module, ht_symtab, thunks);
951 /* add all the public symbols from symtab */
952 if (elf_new_public_symbols(module, ht_symtab) && !ret) ret = TRUE;
954 return ret;
957 /******************************************************************
958 * elf_load_debug_info
960 * Loads ELF debugging information from the module image file.
962 BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
964 BOOL ret = TRUE;
965 struct pool pool;
966 struct hash_table ht_symtab;
967 struct elf_file_map my_fmap;
969 if (module->type != DMT_ELF || !module->elf_info)
971 ERR("Bad elf module '%s'\n", module->module.LoadedImageName);
972 return FALSE;
975 pool_init(&pool, 65536);
976 hash_table_init(&pool, &ht_symtab, 256);
978 if (!fmap)
980 fmap = &my_fmap;
981 ret = elf_map_file(module->module.LoadedImageName, fmap);
983 if (ret)
984 ret = elf_load_debug_info_from_map(module, fmap, &pool, &ht_symtab);
986 pool_destroy(&pool);
987 if (fmap == &my_fmap) elf_unmap_file(fmap);
988 return ret;
991 /******************************************************************
992 * elf_fetch_file_info
994 * Gathers some more information for an ELF module from a given file
996 BOOL elf_fetch_file_info(const char* name, DWORD* base,
997 DWORD* size, DWORD* checksum)
999 struct elf_file_map fmap;
1000 if (!elf_map_file(name, &fmap)) return FALSE;
1001 if (base) *base = fmap.elf_start;
1002 *size = fmap.elf_size;
1003 *checksum = calc_crc32(&fmap);
1004 elf_unmap_file(&fmap);
1005 return TRUE;
1008 /******************************************************************
1009 * is_dt_flag_valid
1010 * returns true iff the section tag is valid
1012 static unsigned is_dt_flag_valid(unsigned d_tag)
1014 #ifndef DT_PROCNUM
1015 #define DT_PROCNUM 0
1016 #endif
1017 #ifndef DT_EXTRANUM
1018 #define DT_EXTRANUM 0
1019 #endif
1020 return (d_tag >= 0 && d_tag < DT_NUM + DT_PROCNUM + DT_EXTRANUM)
1021 #if defined(DT_LOOS) && defined(DT_HIOS)
1022 || (d_tag >= DT_LOOS && d_tag < DT_HIOS)
1023 #endif
1024 #if defined(DT_LOPROC) && defined(DT_HIPROC)
1025 || (d_tag >= DT_LOPROC && d_tag < DT_HIPROC)
1026 #endif
1030 /******************************************************************
1031 * elf_load_file
1033 * Loads the information for ELF module stored in 'filename'
1034 * the module has been loaded at 'load_offset' address
1035 * returns
1036 * -1 if the file cannot be found/opened
1037 * 0 if the file doesn't contain symbolic info (or this info cannot be
1038 * read or parsed)
1039 * 1 on success
1041 static BOOL elf_load_file(struct process* pcs, const char* filename,
1042 unsigned long load_offset, struct elf_info* elf_info)
1044 BOOL ret = FALSE;
1045 struct elf_file_map fmap;
1046 int i;
1048 TRACE("Processing elf file '%s' at %08lx\n", filename, load_offset);
1050 if (!elf_map_file(filename, &fmap)) goto leave;
1052 /* Next, we need to find a few of the internal ELF headers within
1053 * this thing. We need the main executable header, and the section
1054 * table.
1056 if (!fmap.elf_start && !load_offset)
1057 ERR("Relocatable ELF %s, but no load address. Loading at 0x0000000\n",
1058 filename);
1059 if (fmap.elf_start && load_offset)
1061 WARN("Non-relocatable ELF %s, but load address of 0x%08lx supplied. "
1062 "Assuming load address is corrupt\n", filename, load_offset);
1063 load_offset = 0;
1066 if (elf_info->flags & ELF_INFO_DEBUG_HEADER)
1068 const char* shstrtab = elf_map_section(&fmap, fmap.elfhdr.e_shstrndx);
1069 if (shstrtab == NO_MAP) goto leave;
1070 for (i = 0; i < fmap.elfhdr.e_shnum; i++)
1072 if (strcmp(shstrtab + fmap.sect[i].shdr.sh_name, ".dynamic") == 0 &&
1073 fmap.sect[i].shdr.sh_type == SHT_DYNAMIC)
1075 Elf32_Dyn dyn;
1076 char* ptr = (char*)fmap.sect[i].shdr.sh_addr;
1077 unsigned long len;
1081 if (!ReadProcessMemory(pcs->handle, ptr, &dyn, sizeof(dyn), &len) ||
1082 len != sizeof(dyn) || !is_dt_flag_valid(dyn.d_tag))
1083 dyn.d_tag = DT_NULL;
1084 ptr += sizeof(dyn);
1085 } while (dyn.d_tag != DT_DEBUG && dyn.d_tag != DT_NULL);
1086 if (dyn.d_tag == DT_NULL) goto leave;
1087 elf_info->dbg_hdr_addr = dyn.d_un.d_ptr;
1090 elf_unmap_section(&fmap, fmap.elfhdr.e_shstrndx);
1093 if (elf_info->flags & ELF_INFO_MODULE)
1095 struct elf_module_info *elf_module_info =
1096 HeapAlloc(GetProcessHeap(), 0, sizeof(struct elf_module_info));
1097 if (!elf_module_info) goto leave;
1098 elf_info->module = module_new(pcs, filename, DMT_ELF, FALSE,
1099 (load_offset) ? load_offset : fmap.elf_start,
1100 fmap.elf_size, 0, calc_crc32(&fmap));
1101 if (!elf_info->module)
1103 HeapFree(GetProcessHeap(), 0, elf_module_info);
1104 goto leave;
1106 elf_info->module->elf_info = elf_module_info;
1107 elf_info->module->elf_info->elf_addr = load_offset;
1109 if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
1111 elf_info->module->module.SymType = SymDeferred;
1112 ret = TRUE;
1114 else ret = elf_load_debug_info(elf_info->module, &fmap);
1116 elf_info->module->elf_info->elf_mark = 1;
1117 elf_info->module->elf_info->elf_loader = 0;
1118 } else ret = TRUE;
1120 if (elf_info->flags & ELF_INFO_NAME)
1122 elf_info->module_name = strcpy(HeapAlloc(GetProcessHeap(), 0,
1123 strlen(filename) + 1), filename);
1125 leave:
1126 elf_unmap_file(&fmap);
1128 return ret;
1131 /******************************************************************
1132 * elf_load_file_from_path
1133 * tries to load an ELF file from a set of paths (separated by ':')
1135 static BOOL elf_load_file_from_path(HANDLE hProcess,
1136 const char* filename,
1137 unsigned long load_offset,
1138 const char* path,
1139 struct elf_info* elf_info)
1141 BOOL ret = FALSE;
1142 char *s, *t, *fn;
1143 char* paths = NULL;
1145 if (!path) return FALSE;
1147 paths = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(path) + 1), path);
1148 for (s = paths; s && *s; s = (t) ? (t+1) : NULL)
1150 t = strchr(s, ':');
1151 if (t) *t = '\0';
1152 fn = HeapAlloc(GetProcessHeap(), 0, strlen(filename) + 1 + strlen(s) + 1);
1153 if (!fn) break;
1154 strcpy(fn, s);
1155 strcat(fn, "/");
1156 strcat(fn, filename);
1157 ret = elf_load_file(hProcess, fn, load_offset, elf_info);
1158 HeapFree(GetProcessHeap(), 0, fn);
1159 if (ret) break;
1160 s = (t) ? (t+1) : NULL;
1163 HeapFree(GetProcessHeap(), 0, paths);
1164 return ret;
1167 /******************************************************************
1168 * elf_load_file_from_dll_path
1170 * Tries to load an ELF file from the dll path
1172 static BOOL elf_load_file_from_dll_path(HANDLE hProcess,
1173 const char* filename,
1174 unsigned long load_offset,
1175 struct elf_info* elf_info)
1177 BOOL ret = FALSE;
1178 unsigned int index = 0;
1179 const char *path;
1181 while (!ret && (path = wine_dll_enum_load_path( index++ )))
1183 char *name = HeapAlloc( GetProcessHeap(), 0, strlen(path) + strlen(filename) + 2 );
1184 if (!name) break;
1185 strcpy( name, path );
1186 strcat( name, "/" );
1187 strcat( name, filename );
1188 ret = elf_load_file(hProcess, name, load_offset, elf_info);
1189 HeapFree( GetProcessHeap(), 0, name );
1191 return ret;
1194 /******************************************************************
1195 * elf_search_and_load_file
1197 * lookup a file in standard ELF locations, and if found, load it
1199 static BOOL elf_search_and_load_file(struct process* pcs, const char* filename,
1200 unsigned long load_offset,
1201 struct elf_info* elf_info)
1203 BOOL ret = FALSE;
1204 struct module* module;
1206 if (filename == NULL || *filename == '\0') return FALSE;
1207 if ((module = module_find_by_name(pcs, filename, DMT_ELF)))
1209 elf_info->module = module;
1210 module->elf_info->elf_mark = 1;
1211 return module->module.SymType;
1214 if (strstr(filename, "libstdc++")) return FALSE; /* We know we can't do it */
1215 ret = elf_load_file(pcs, filename, load_offset, elf_info);
1216 /* if relative pathname, try some absolute base dirs */
1217 if (!ret && !strchr(filename, '/'))
1219 ret = elf_load_file_from_path(pcs, filename, load_offset,
1220 getenv("PATH"), elf_info) ||
1221 elf_load_file_from_path(pcs, filename, load_offset,
1222 getenv("LD_LIBRARY_PATH"), elf_info);
1223 if (!ret) ret = elf_load_file_from_dll_path(pcs, filename, load_offset, elf_info);
1226 return ret;
1229 /******************************************************************
1230 * elf_enum_modules_internal
1232 * Enumerate ELF modules from a running process
1234 static BOOL elf_enum_modules_internal(const struct process* pcs,
1235 const char* main_name,
1236 elf_enum_modules_cb cb, void* user)
1238 struct r_debug dbg_hdr;
1239 void* lm_addr;
1240 struct link_map lm;
1241 char bufstr[256];
1243 if (!pcs->dbg_hdr_addr ||
1244 !ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr,
1245 &dbg_hdr, sizeof(dbg_hdr), NULL))
1246 return FALSE;
1248 /* Now walk the linked list. In all known ELF implementations,
1249 * the dynamic loader maintains this linked list for us. In some
1250 * cases the first entry doesn't appear with a name, in other cases it
1251 * does.
1253 for (lm_addr = (void*)dbg_hdr.r_map; lm_addr; lm_addr = (void*)lm.l_next)
1255 if (!ReadProcessMemory(pcs->handle, lm_addr, &lm, sizeof(lm), NULL))
1256 return FALSE;
1258 if (lm.l_prev != NULL && /* skip first entry, normally debuggee itself */
1259 lm.l_name != NULL &&
1260 ReadProcessMemory(pcs->handle, lm.l_name, bufstr, sizeof(bufstr), NULL))
1262 bufstr[sizeof(bufstr) - 1] = '\0';
1263 if (main_name && !bufstr[0]) strcpy(bufstr, main_name);
1264 if (!cb(bufstr, (unsigned long)lm.l_addr, user)) break;
1267 return TRUE;
1270 struct elf_sync
1272 struct process* pcs;
1273 struct elf_info elf_info;
1276 static BOOL elf_enum_sync_cb(const char* name, unsigned long addr, void* user)
1278 struct elf_sync* es = user;
1280 elf_search_and_load_file(es->pcs, name, addr, &es->elf_info);
1281 return TRUE;
1284 /******************************************************************
1285 * elf_synchronize_module_list
1287 * this functions rescans the debuggee module's list and synchronizes it with
1288 * the one from 'pcs', ie:
1289 * - if a module is in debuggee and not in pcs, it's loaded into pcs
1290 * - if a module is in pcs and not in debuggee, it's unloaded from pcs
1292 BOOL elf_synchronize_module_list(struct process* pcs)
1294 struct module* module;
1295 struct elf_sync es;
1297 for (module = pcs->lmodules; module; module = module->next)
1299 if (module->type == DMT_ELF && !module->is_virtual)
1300 module->elf_info->elf_mark = 0;
1303 es.pcs = pcs;
1304 es.elf_info.flags = ELF_INFO_MODULE;
1305 if (!elf_enum_modules_internal(pcs, NULL, elf_enum_sync_cb, &es))
1306 return FALSE;
1308 module = pcs->lmodules;
1309 while (module)
1311 if (module->type == DMT_ELF && !module->is_virtual &&
1312 !module->elf_info->elf_mark && !module->elf_info->elf_loader)
1314 module_remove(pcs, module);
1315 /* restart all over */
1316 module = pcs->lmodules;
1318 else module = module->next;
1320 return TRUE;
1323 /******************************************************************
1324 * elf_search_loader
1326 * Lookup in a running ELF process the loader, and sets its ELF link
1327 * address (for accessing the list of loaded .so libs) in pcs.
1328 * If flags is ELF_INFO_MODULE, the module for the loader is also
1329 * added as a module into pcs.
1331 static BOOL elf_search_loader(struct process* pcs, struct elf_info* elf_info)
1333 BOOL ret;
1334 const char* ptr;
1336 /* All binaries are loaded with WINELOADER (if run from tree) or by the
1337 * main executable (either wine-kthread or wine-pthread)
1338 * FIXME: the heuristic used to know whether we need to load wine-pthread
1339 * or wine-kthread is not 100% safe
1341 if ((ptr = getenv("WINELOADER")))
1342 ret = elf_search_and_load_file(pcs, ptr, 0, elf_info);
1343 else
1345 ret = elf_search_and_load_file(pcs, "wine-kthread", 0, elf_info) ||
1346 elf_search_and_load_file(pcs, "wine-pthread", 0, elf_info);
1348 return ret;
1351 /******************************************************************
1352 * elf_read_wine_loader_dbg_info
1354 * Try to find a decent wine executable which could have loaded the debuggee
1356 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1358 struct elf_info elf_info;
1360 elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_MODULE;
1361 if (!elf_search_loader(pcs, &elf_info)) return FALSE;
1362 elf_info.module->elf_info->elf_loader = 1;
1363 strcpy(elf_info.module->module.ModuleName, "<wine-loader>");
1364 return (pcs->dbg_hdr_addr = elf_info.dbg_hdr_addr) != 0;
1367 /******************************************************************
1368 * elf_enum_modules
1370 * Enumerates the ELF loaded modules from a running target (hProc)
1371 * This function doesn't require that someone has called SymInitialize
1372 * on this very process.
1374 BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb cb, void* user)
1376 struct process pcs;
1377 struct elf_info elf_info;
1378 BOOL ret;
1380 memset(&pcs, 0, sizeof(pcs));
1381 pcs.handle = hProc;
1382 elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_NAME;
1383 if (!elf_search_loader(&pcs, &elf_info)) return FALSE;
1384 pcs.dbg_hdr_addr = elf_info.dbg_hdr_addr;
1385 ret = elf_enum_modules_internal(&pcs, elf_info.module_name, cb, user);
1386 HeapFree(GetProcessHeap(), 0, (char*)elf_info.module_name);
1387 return ret;
1390 struct elf_load
1392 struct process* pcs;
1393 struct elf_info elf_info;
1394 const char* name;
1395 BOOL ret;
1398 /******************************************************************
1399 * elf_load_cb
1401 * Callback for elf_load_module, used to walk the list of loaded
1402 * modules.
1404 static BOOL elf_load_cb(const char* name, unsigned long addr, void* user)
1406 struct elf_load* el = user;
1407 const char* p;
1409 /* memcmp is needed for matches when bufstr contains also version information
1410 * el->name: libc.so, name: libc.so.6.0
1412 p = strrchr(name, '/');
1413 if (!p++) p = name;
1414 if (!memcmp(p, el->name, strlen(el->name)))
1416 el->ret = elf_search_and_load_file(el->pcs, name, addr, &el->elf_info);
1417 return FALSE;
1419 return TRUE;
1422 /******************************************************************
1423 * elf_load_module
1425 * loads an ELF module and stores it in process' module list
1426 * Also, find module real name and load address from
1427 * the real loaded modules list in pcs address space
1429 struct module* elf_load_module(struct process* pcs, const char* name, unsigned long addr)
1431 struct elf_load el;
1433 TRACE("(%p %s %08lx)\n", pcs, name, addr);
1435 el.elf_info.flags = ELF_INFO_MODULE;
1436 el.ret = FALSE;
1438 if (pcs->dbg_hdr_addr) /* we're debugging a life target */
1440 el.pcs = pcs;
1441 /* do only the lookup from the filename, not the path (as we lookup module
1442 * name in the process' loaded module list)
1444 el.name = strrchr(name, '/');
1445 if (!el.name++) el.name = name;
1446 el.ret = FALSE;
1448 if (!elf_enum_modules_internal(pcs, NULL, elf_load_cb, &el))
1449 return NULL;
1451 else if (addr)
1453 el.ret = elf_search_and_load_file(pcs, name, addr, &el.elf_info);
1455 if (!el.ret) return NULL;
1456 assert(el.elf_info.module);
1457 return el.elf_info.module;
1460 #else /* !__ELF__ */
1462 BOOL elf_synchronize_module_list(struct process* pcs)
1464 return FALSE;
1467 BOOL elf_fetch_file_info(const char* name, DWORD* base,
1468 DWORD* size, DWORD* checksum)
1470 return FALSE;
1473 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1475 return FALSE;
1478 BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb cb, void* user)
1480 return FALSE;
1483 struct module* elf_load_module(struct process* pcs, const char* name, DWORD addr)
1485 return NULL;
1488 BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
1490 return FALSE;
1493 int elf_is_in_thunk_area(unsigned long addr,
1494 const struct elf_thunk_area* thunks)
1496 return -1;
1498 #endif /* __ELF__ */