2 * File elf.c - processing of ELF files
4 * Copyright (C) 1996, Eric Youngdale.
5 * 1999-2007 Eric Pouech
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include "wine/port.h"
25 #if defined(__svr4__) || defined(__sun)
27 /* large files are not supported by libelf */
28 #undef _FILE_OFFSET_BITS
29 #define _FILE_OFFSET_BITS 32
35 #ifdef HAVE_SYS_STAT_H
36 # include <sys/stat.h>
39 #ifdef HAVE_SYS_MMAN_H
46 #define PATH_MAX MAX_PATH
49 #include "dbghelp_private.h"
54 #ifdef HAVE_SYS_ELF32_H
55 # include <sys/elf32.h>
57 #ifdef HAVE_SYS_EXEC_ELF_H
58 # include <sys/exec_elf.h>
61 # if defined(DT_COUNT)
62 # define DT_NUM DT_COUNT
64 /* this seems to be a satisfactory value on Solaris, which doesn't support this AFAICT */
71 #ifdef HAVE_SYS_LINK_H
72 # include <sys/link.h>
75 #include "wine/library.h"
76 #include "wine/debug.h"
78 struct elf_module_info
80 unsigned long elf_addr;
81 unsigned short elf_mark : 1,
87 #define ELF_INFO_DEBUG_HEADER 0x0001
88 #define ELF_INFO_MODULE 0x0002
89 #define ELF_INFO_NAME 0x0004
91 WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
95 unsigned flags; /* IN one (or several) of the ELF_INFO constants */
96 unsigned long dbg_hdr_addr; /* OUT address of debug header (if ELF_INFO_DEBUG_HEADER is set) */
97 struct module* module; /* OUT loaded module (if ELF_INFO_MODULE is set) */
98 const WCHAR* module_name; /* OUT found module name (if ELF_INFO_NAME is set) */
101 /* structure holding information while handling an ELF image
102 * allows one by one section mapping for memory savings
115 const char* shstrtab;
116 struct elf_file_map* alternate; /* another ELF file (linked to this one) */
119 struct elf_section_map
121 struct elf_file_map* fmap;
127 struct hash_table_elt ht_elt;
128 const Elf32_Sym* symp;
129 struct symt_compiland* compiland;
133 struct elf_thunk_area
136 THUNK_ORDINAL ordinal;
137 unsigned long rva_start;
138 unsigned long rva_end;
141 /******************************************************************
144 * Maps a single section into memory from an ELF file
146 static const char* elf_map_section(struct elf_section_map* esm)
148 unsigned pgsz = getpagesize();
151 if (esm->sidx < 0 || esm->sidx >= esm->fmap->elfhdr.e_shnum ||
152 esm->fmap->sect[esm->sidx].shdr.sh_type == SHT_NOBITS)
155 /* align required information on page size (we assume pagesize is a power of 2) */
156 ofst = esm->fmap->sect[esm->sidx].shdr.sh_offset & ~(pgsz - 1);
157 size = ((esm->fmap->sect[esm->sidx].shdr.sh_offset +
158 esm->fmap->sect[esm->sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1)) - ofst;
159 esm->fmap->sect[esm->sidx].mapped = mmap(NULL, size, PROT_READ, MAP_PRIVATE,
160 esm->fmap->fd, ofst);
161 if (esm->fmap->sect[esm->sidx].mapped == ELF_NO_MAP) return ELF_NO_MAP;
162 return esm->fmap->sect[esm->sidx].mapped + (esm->fmap->sect[esm->sidx].shdr.sh_offset & (pgsz - 1));
165 /******************************************************************
168 * Finds a section by name (and type) into memory from an ELF file
169 * or its alternate if any
171 static BOOL elf_find_section(struct elf_file_map* fmap, const char* name,
172 unsigned sht, struct elf_section_map* esm)
178 if (fmap->shstrtab == ELF_NO_MAP)
180 struct elf_section_map hdr_esm = {fmap, fmap->elfhdr.e_shstrndx};
181 fmap->shstrtab = elf_map_section(&hdr_esm);
182 if (fmap->shstrtab == ELF_NO_MAP) return FALSE;
184 for (i = 0; i < fmap->elfhdr.e_shnum; i++)
186 if (strcmp(fmap->shstrtab + fmap->sect[i].shdr.sh_name, name) == 0 &&
187 (sht == SHT_NULL || sht == fmap->sect[i].shdr.sh_type))
194 fmap = fmap->alternate;
199 /******************************************************************
202 * Unmaps a single section from memory
204 static void elf_unmap_section(struct elf_section_map* esm)
206 if (esm->sidx >= 0 && esm->sidx < esm->fmap->elfhdr.e_shnum && esm->fmap->sect[esm->sidx].mapped != ELF_NO_MAP)
208 unsigned pgsz = getpagesize();
211 ofst = esm->fmap->sect[esm->sidx].shdr.sh_offset & ~(pgsz - 1);
212 size = ((esm->fmap->sect[esm->sidx].shdr.sh_offset +
213 esm->fmap->sect[esm->sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1)) - ofst;
214 if (munmap((char*)esm->fmap->sect[esm->sidx].mapped, size) < 0)
215 WARN("Couldn't unmap the section\n");
216 esm->fmap->sect[esm->sidx].mapped = ELF_NO_MAP;
220 static void elf_end_find(struct elf_file_map* fmap)
222 struct elf_section_map esm;
227 esm.sidx = fmap->elfhdr.e_shstrndx;
228 elf_unmap_section(&esm);
229 fmap->shstrtab = ELF_NO_MAP;
230 fmap = fmap->alternate;
234 /******************************************************************
237 * Get the size of an ELF section
239 static inline unsigned elf_get_map_size(struct elf_section_map* esm)
241 if (esm->sidx < 0 || esm->sidx >= esm->fmap->elfhdr.e_shnum)
243 return esm->fmap->sect[esm->sidx].shdr.sh_size;
246 /******************************************************************
249 * Maps an ELF file into memory (and checks it's a real ELF file)
251 static BOOL elf_map_file(const WCHAR* filenameW, struct elf_file_map* fmap)
253 static const BYTE elf_signature[4] = { ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3 };
257 unsigned tmp, page_mask = getpagesize() - 1;
262 len = WideCharToMultiByte(CP_UNIXCP, 0, filenameW, -1, NULL, 0, NULL, NULL);
263 if (!(filename = HeapAlloc(GetProcessHeap(), 0, len))) return FALSE;
264 WideCharToMultiByte(CP_UNIXCP, 0, filenameW, -1, filename, len, NULL, NULL);
267 fmap->shstrtab = ELF_NO_MAP;
268 fmap->alternate = NULL;
270 /* check that the file exists, and that the module hasn't been loaded yet */
271 if (stat(filename, &statbuf) == -1 || S_ISDIR(statbuf.st_mode)) goto done;
273 /* Now open the file, so that we can mmap() it. */
274 if ((fmap->fd = open(filename, O_RDONLY)) == -1) goto done;
276 if (read(fmap->fd, &fmap->elfhdr, sizeof(fmap->elfhdr)) != sizeof(fmap->elfhdr))
278 /* and check for an ELF header */
279 if (memcmp(fmap->elfhdr.e_ident,
280 elf_signature, sizeof(elf_signature))) goto done;
282 fmap->sect = HeapAlloc(GetProcessHeap(), 0,
283 fmap->elfhdr.e_shnum * sizeof(fmap->sect[0]));
284 if (!fmap->sect) goto done;
286 lseek(fmap->fd, fmap->elfhdr.e_shoff, SEEK_SET);
287 for (i = 0; i < fmap->elfhdr.e_shnum; i++)
289 read(fmap->fd, &fmap->sect[i].shdr, sizeof(fmap->sect[i].shdr));
290 fmap->sect[i].mapped = ELF_NO_MAP;
293 /* grab size of module once loaded in memory */
294 lseek(fmap->fd, fmap->elfhdr.e_phoff, SEEK_SET);
296 fmap->elf_start = ~0L;
297 for (i = 0; i < fmap->elfhdr.e_phnum; i++)
299 if (read(fmap->fd, &phdr, sizeof(phdr)) == sizeof(phdr) &&
300 phdr.p_type == PT_LOAD)
302 tmp = (phdr.p_vaddr + phdr.p_memsz + page_mask) & ~page_mask;
303 if (fmap->elf_size < tmp) fmap->elf_size = tmp;
304 if (phdr.p_vaddr < fmap->elf_start) fmap->elf_start = phdr.p_vaddr;
307 /* if non relocatable ELF, then remove fixed address from computation
308 * otherwise, all addresses are zero based and start has no effect
310 fmap->elf_size -= fmap->elf_start;
313 HeapFree(GetProcessHeap(), 0, filename);
317 /******************************************************************
320 * Unmaps an ELF file from memory (previously mapped with elf_map_file)
322 static void elf_unmap_file(struct elf_file_map* fmap)
328 struct elf_section_map esm;
330 for (esm.sidx = 0; esm.sidx < fmap->elfhdr.e_shnum; esm.sidx++)
332 elf_unmap_section(&esm);
334 HeapFree(GetProcessHeap(), 0, fmap->sect);
337 fmap = fmap->alternate;
341 /******************************************************************
342 * elf_is_in_thunk_area
344 * Check whether an address lies within one of the thunk area we
347 int elf_is_in_thunk_area(unsigned long addr,
348 const struct elf_thunk_area* thunks)
352 for (i = 0; thunks[i].symname; i++)
354 if (addr >= thunks[i].rva_start && addr < thunks[i].rva_end)
360 /******************************************************************
363 * creating an internal hash table to ease use ELF symtab information lookup
365 static void elf_hash_symtab(struct module* module, struct pool* pool,
366 struct hash_table* ht_symtab, struct elf_file_map* fmap,
367 struct elf_thunk_area* thunks)
372 struct symt_compiland* compiland = NULL;
374 const Elf32_Sym* symp;
375 struct symtab_elt* ste;
376 struct elf_section_map esm, esm_str;
378 if (!elf_find_section(fmap, ".symtab", SHT_SYMTAB, &esm) &&
379 !elf_find_section(fmap, ".dynsym", SHT_DYNSYM, &esm)) return;
380 if ((symp = (const Elf32_Sym*)elf_map_section(&esm)) == ELF_NO_MAP) return;
382 esm_str.sidx = fmap->sect[esm.sidx].shdr.sh_link;
383 if ((strp = elf_map_section(&esm_str)) == ELF_NO_MAP) return;
385 nsym = elf_get_map_size(&esm) / sizeof(*symp);
387 for (j = 0; thunks[j].symname; j++)
388 thunks[j].rva_start = thunks[j].rva_end = 0;
390 for (i = 0; i < nsym; i++, symp++)
392 /* Ignore certain types of entries which really aren't of that much
395 if ((ELF32_ST_TYPE(symp->st_info) != STT_NOTYPE &&
396 ELF32_ST_TYPE(symp->st_info) != STT_FILE &&
397 ELF32_ST_TYPE(symp->st_info) != STT_OBJECT &&
398 ELF32_ST_TYPE(symp->st_info) != STT_FUNC) ||
399 symp->st_shndx == SHN_UNDEF)
404 symname = strp + symp->st_name;
406 /* handle some specific symtab (that we'll throw away when done) */
407 switch (ELF32_ST_TYPE(symp->st_info))
411 compiland = symt_new_compiland(module, symp->st_value,
412 source_new(module, NULL, symname));
417 /* we are only interested in wine markers inserted by winebuild */
418 for (j = 0; thunks[j].symname; j++)
420 if (!strcmp(symname, thunks[j].symname))
422 thunks[j].rva_start = symp->st_value;
423 thunks[j].rva_end = symp->st_value + symp->st_size;
430 /* FIXME: we don't need to handle them (GCC internals)
431 * Moreover, they screw up our symbol lookup :-/
433 if (symname[0] == '.' && symname[1] == 'L' && isdigit(symname[2]))
436 ste = pool_alloc(pool, sizeof(*ste));
437 ste->ht_elt.name = symname;
438 /* GCC emits, in some cases, a .<digit>+ suffix.
439 * This is used for static variable inside functions, so
440 * that we can have several such variables with same name in
441 * the same compilation unit
442 * We simply ignore that suffix when present (we also get rid
443 * of it in stabs parsing)
445 ptr = symname + strlen(symname) - 1;
448 while (isdigit(*ptr) && ptr >= symname) ptr--;
449 if (ptr > symname && *ptr == '.')
451 char* n = pool_alloc(pool, ptr - symname + 1);
452 memcpy(n, symname, ptr - symname + 1);
453 n[ptr - symname] = '\0';
454 ste->ht_elt.name = n;
458 ste->compiland = compiland;
460 hash_table_add(ht_symtab, &ste->ht_elt);
462 /* as we added in the ht_symtab pointers to the symbols themselves,
463 * we cannot unmap yet the sections, it will be done when we're over
468 /******************************************************************
471 * lookup a symbol by name in our internal hash table for the symtab
473 static const Elf32_Sym* elf_lookup_symtab(const struct module* module,
474 const struct hash_table* ht_symtab,
475 const char* name, struct symt* compiland)
477 struct symtab_elt* weak_result = NULL; /* without compiland name */
478 struct symtab_elt* result = NULL;
479 struct hash_table_iter hti;
480 struct symtab_elt* ste;
481 const char* compiland_name;
482 const char* compiland_basename;
485 /* we need weak match up (at least) when symbols of same name,
486 * defined several times in different compilation units,
487 * are merged in a single one (hence a different filename for c.u.)
491 compiland_name = source_get(module,
492 ((struct symt_compiland*)compiland)->source);
493 compiland_basename = strrchr(compiland_name, '/');
494 if (!compiland_basename++) compiland_basename = compiland_name;
496 else compiland_name = compiland_basename = NULL;
498 hash_table_iter_init(ht_symtab, &hti, name);
499 while ((ste = hash_table_iter_up(&hti)))
501 if (ste->used || strcmp(ste->ht_elt.name, name)) continue;
504 if ((ste->compiland && !compiland_name) || (!ste->compiland && compiland_name))
506 if (ste->compiland && compiland_name)
508 const char* filename = source_get(module, ste->compiland->source);
509 if (strcmp(filename, compiland_name))
511 base = strrchr(filename, '/');
512 if (!base++) base = filename;
513 if (strcmp(base, compiland_basename)) continue;
518 FIXME("Already found symbol %s (%s) in symtab %s @%08x and %s @%08x\n",
519 name, compiland_name,
520 source_get(module, result->compiland->source), result->symp->st_value,
521 source_get(module, ste->compiland->source), ste->symp->st_value);
529 if (!result && !(result = weak_result))
531 FIXME("Couldn't find symbol %s!%s in symtab\n",
532 debugstr_w(module->module.ModuleName), name);
538 /******************************************************************
539 * elf_finish_stabs_info
541 * - get any relevant information (address & size) from the bits we got from the
542 * stabs debugging information
544 static void elf_finish_stabs_info(struct module* module, struct hash_table* symtab)
546 struct hash_table_iter hti;
549 const Elf32_Sym* symp;
551 hash_table_iter_init(&module->ht_symbols, &hti, NULL);
552 while ((ptr = hash_table_iter_up(&hti)))
554 sym = GET_ENTRY(ptr, struct symt_ht, hash_elt);
555 switch (sym->symt.tag)
558 if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
559 ((struct symt_function*)sym)->size)
563 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name,
564 ((struct symt_function*)sym)->container);
567 if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
568 ((struct symt_function*)sym)->address != module->elf_info->elf_addr + symp->st_value)
569 FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
570 sym, debugstr_w(module->module.ModuleName), sym->hash_elt.name,
571 ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
572 if (((struct symt_function*)sym)->size && ((struct symt_function*)sym)->size != symp->st_size)
573 FIXME("Changing size for %p/%s!%s from %08lx to %08x\n",
574 sym, debugstr_w(module->module.ModuleName), sym->hash_elt.name,
575 ((struct symt_function*)sym)->size, symp->st_size);
577 ((struct symt_function*)sym)->address = module->elf_info->elf_addr +
579 ((struct symt_function*)sym)->size = symp->st_size;
581 FIXME("Couldn't find %s!%s\n",
582 debugstr_w(module->module.ModuleName), sym->hash_elt.name);
585 switch (((struct symt_data*)sym)->kind)
588 case DataIsFileStatic:
589 if (((struct symt_data*)sym)->u.var.offset != module->elf_info->elf_addr)
591 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name,
592 ((struct symt_data*)sym)->container);
595 if (((struct symt_data*)sym)->u.var.offset != module->elf_info->elf_addr &&
596 ((struct symt_data*)sym)->u.var.offset != module->elf_info->elf_addr + symp->st_value)
597 FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
598 sym, debugstr_w(module->module.ModuleName), sym->hash_elt.name,
599 ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
600 ((struct symt_data*)sym)->u.var.offset = module->elf_info->elf_addr +
602 ((struct symt_data*)sym)->kind = (ELF32_ST_BIND(symp->st_info) == STB_LOCAL) ?
603 DataIsFileStatic : DataIsGlobal;
605 FIXME("Couldn't find %s!%s\n",
606 debugstr_w(module->module.ModuleName), sym->hash_elt.name);
612 FIXME("Unsupported tag %u\n", sym->symt.tag);
616 /* since we may have changed some addresses & sizes, mark the module to be resorted */
617 module->sortlist_valid = FALSE;
620 /******************************************************************
621 * elf_load_wine_thunks
623 * creating the thunk objects for a wine native DLL
625 static int elf_new_wine_thunks(struct module* module, struct hash_table* ht_symtab,
626 const struct elf_thunk_area* thunks)
629 struct hash_table_iter hti;
630 struct symtab_elt* ste;
632 struct symt_ht* symt;
634 hash_table_iter_init(ht_symtab, &hti, NULL);
635 while ((ste = hash_table_iter_up(&hti)))
637 if (ste->used) continue;
639 addr = module->elf_info->elf_addr + ste->symp->st_value;
641 j = elf_is_in_thunk_area(ste->symp->st_value, thunks);
642 if (j >= 0) /* thunk found */
644 symt_new_thunk(module, ste->compiland, ste->ht_elt.name, thunks[j].ordinal,
645 addr, ste->symp->st_size);
651 symt = symt_find_nearest(module, addr);
653 symt_get_info(&symt->symt, TI_GET_ADDRESS, &ref_addr);
654 if (!symt || addr != ref_addr)
656 /* creating public symbols for all the ELF symbols which haven't been
657 * used yet (ie we have no debug information on them)
658 * That's the case, for example, of the .spec.c files
660 switch (ELF32_ST_TYPE(ste->symp->st_info))
663 symt_new_function(module, ste->compiland, ste->ht_elt.name,
664 addr, ste->symp->st_size, NULL);
667 symt_new_global_variable(module, ste->compiland, ste->ht_elt.name,
668 ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL,
669 addr, ste->symp->st_size, NULL);
672 FIXME("Shouldn't happen\n");
675 /* FIXME: this is a hack !!!
676 * we are adding new symbols, but as we're parsing a symbol table
677 * (hopefully without duplicate symbols) we delay rebuilding the sorted
678 * module table until we're done with the symbol table
679 * Otherwise, as we intertwine symbols's add and lookup, performance
682 module->sortlist_valid = TRUE;
684 else if (strcmp(ste->ht_elt.name, symt->hash_elt.name))
686 ULONG64 xaddr = 0, xsize = 0;
689 symt_get_info(&symt->symt, TI_GET_ADDRESS, &xaddr);
690 symt_get_info(&symt->symt, TI_GET_LENGTH, &xsize);
691 symt_get_info(&symt->symt, TI_GET_DATAKIND, &kind);
693 /* If none of symbols has a correct size, we consider they are both markers
694 * Hence, we can silence this warning
695 * Also, we check that we don't have two symbols, one local, the other
696 * global which is legal
698 if ((xsize || ste->symp->st_size) &&
699 (kind == (ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL) ? DataIsFileStatic : DataIsGlobal))
700 FIXME("Duplicate in %s: %s<%08x-%08x> %s<%s-%s>\n",
701 debugstr_w(module->module.ModuleName),
702 ste->ht_elt.name, addr, ste->symp->st_size,
704 wine_dbgstr_longlong(xaddr), wine_dbgstr_longlong(xsize));
708 /* see comment above */
709 module->sortlist_valid = FALSE;
713 /******************************************************************
714 * elf_new_public_symbols
716 * Creates a set of public symbols from an ELF symtab
718 static int elf_new_public_symbols(struct module* module, struct hash_table* symtab)
720 struct hash_table_iter hti;
721 struct symtab_elt* ste;
723 if (dbghelp_options & SYMOPT_NO_PUBLICS) return TRUE;
725 /* FIXME: we're missing the ELF entry point here */
727 hash_table_iter_init(symtab, &hti, NULL);
728 while ((ste = hash_table_iter_up(&hti)))
730 symt_new_public(module, ste->compiland, ste->ht_elt.name,
731 module->elf_info->elf_addr + ste->symp->st_value,
732 ste->symp->st_size, TRUE /* FIXME */,
733 ELF32_ST_TYPE(ste->symp->st_info) == STT_FUNC);
738 /* Copyright (C) 1986 Gary S. Brown. Modified by Robert Shearman. You may use
739 the following calc_crc32 code or tables extracted from it, as desired without
742 /**********************************************************************\
743 |* Demonstration program to compute the 32-bit CRC used as the frame *|
744 |* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 *|
745 |* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level *|
746 |* protocol). The 32-bit FCS was added via the Federal Register, *|
747 |* 1 June 1982, p.23798. I presume but don't know for certain that *|
748 |* this polynomial is or will be included in CCITT V.41, which *|
749 |* defines the 16-bit CRC (often called CRC-CCITT) polynomial. FIPS *|
750 |* PUB 78 says that the 32-bit FCS reduces otherwise undetected *|
751 |* errors by a factor of 10^-5 over 16-bit FCS. *|
752 \**********************************************************************/
754 /* First, the polynomial itself and its table of feedback terms. The */
756 /* 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 */
757 /* Note that we take it "backwards" and put the highest-order term in */
758 /* the lowest-order bit. The X^32 term is "implied"; the LSB is the */
759 /* X^31 term, etc. The X^0 term (usually shown as "+1") results in */
760 /* the MSB being 1. */
762 /* Note that the usual hardware shift register implementation, which */
763 /* is what we're using (we're merely optimizing it by doing eight-bit */
764 /* chunks at a time) shifts bits into the lowest-order term. In our */
765 /* implementation, that means shifting towards the right. Why do we */
766 /* do it this way? Because the calculated CRC must be transmitted in */
767 /* order from highest-order term to lowest-order term. UARTs transmit */
768 /* characters in order from LSB to MSB. By storing the CRC this way, */
769 /* we hand it to the UART in the order low-byte to high-byte; the UART */
770 /* sends each low-bit to hight-bit; and the result is transmission bit */
771 /* by bit from highest- to lowest-order term without requiring any bit */
772 /* shuffling on our part. Reception works similarly. */
774 /* The feedback terms table consists of 256, 32-bit entries. Notes: */
776 /* 1. The table can be generated at runtime if desired; code to do so */
777 /* is shown later. It might not be obvious, but the feedback */
778 /* terms simply represent the results of eight shift/xor opera- */
779 /* tions for all combinations of data and CRC register values. */
781 /* 2. The CRC accumulation logic is the same for all CRC polynomials, */
782 /* be they sixteen or thirty-two bits wide. You simply choose the */
783 /* appropriate table. Alternatively, because the table can be */
784 /* generated at runtime, you can start by generating the table for */
785 /* the polynomial in question and use exactly the same "updcrc", */
786 /* if your application needn't simultaneously handle two CRC */
787 /* polynomials. (Note, however, that XMODEM is strange.) */
789 /* 3. For 16-bit CRCs, the table entries need be only 16 bits wide; */
790 /* of course, 32-bit entries work OK if the high 16 bits are zero. */
792 /* 4. The values must be right-shifted by eight bits by the "updcrc" */
793 /* logic; the shift must be unsigned (bring in zeroes). On some */
794 /* hardware you could probably optimize the shift in assembler by */
795 /* using byte-swap instructions. */
798 static DWORD calc_crc32(struct elf_file_map* fmap)
800 #define UPDC32(octet,crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
801 static const DWORD crc_32_tab[] =
802 { /* CRC polynomial 0xedb88320 */
803 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
804 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
805 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
806 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
807 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
808 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
809 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
810 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
811 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
812 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
813 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
814 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
815 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
816 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
817 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
818 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
819 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
820 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
821 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
822 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
823 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
824 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
825 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
826 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
827 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
828 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
829 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
830 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
831 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
832 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
833 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
834 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
835 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
836 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
837 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
838 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
839 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
840 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
841 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
842 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
843 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
844 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
845 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
848 unsigned char buffer[256];
851 lseek(fmap->fd, 0, SEEK_SET);
852 while ((r = read(fmap->fd, buffer, sizeof(buffer))) > 0)
854 for (i = 0; i < r; i++) crc = UPDC32(buffer[i], crc);
860 static BOOL elf_check_debug_link(const WCHAR* file, struct elf_file_map* fmap, DWORD crc)
863 if (!elf_map_file(file, fmap)) return FALSE;
864 if (!(ret = crc == calc_crc32(fmap)))
866 WARN("Bad CRC for file %s (got %08x while expecting %08x)\n",
867 debugstr_w(file), calc_crc32(fmap), crc);
868 elf_unmap_file(fmap);
873 /******************************************************************
874 * elf_locate_debug_link
876 * Locate a filename from a .gnu_debuglink section, using the same
878 * "If the full name of the directory containing the executable is
879 * execdir, and the executable has a debug link that specifies the
880 * name debugfile, then GDB will automatically search for the
881 * debugging information file in three places:
882 * - the directory containing the executable file (that is, it
883 * will look for a file named `execdir/debugfile',
884 * - a subdirectory of that directory named `.debug' (that is, the
885 * file `execdir/.debug/debugfile', and
886 * - a subdirectory of the global debug file directory that includes
887 * the executable's full path, and the name from the link (that is,
888 * the file `globaldebugdir/execdir/debugfile', where globaldebugdir
889 * is the global debug file directory, and execdir has been turned
890 * into a relative path)." (from GDB manual)
892 static BOOL elf_locate_debug_link(struct elf_file_map* fmap, const char* filename,
893 const WCHAR* loaded_file, DWORD crc)
895 static const WCHAR globalDebugDirW[] = {'/','u','s','r','/','l','i','b','/','d','e','b','u','g','/'};
896 static const WCHAR dotDebugW[] = {'.','d','e','b','u','g','/'};
897 const size_t globalDebugDirLen = sizeof(globalDebugDirW) / sizeof(WCHAR);
901 struct elf_file_map* fmap_link = NULL;
903 fmap_link = HeapAlloc(GetProcessHeap(), 0, sizeof(*fmap_link));
904 if (!fmap_link) return FALSE;
906 filename_len = MultiByteToWideChar(CP_UNIXCP, 0, filename, -1, NULL, 0);
907 p = HeapAlloc(GetProcessHeap(), 0,
908 (globalDebugDirLen + strlenW(loaded_file) + 6 + 1 + filename_len + 1) * sizeof(WCHAR));
911 /* we prebuild the string with "execdir" */
912 strcpyW(p, loaded_file);
913 slash = strrchrW(p, '/');
914 if (slash == NULL) slash = p; else slash++;
916 /* testing execdir/filename */
917 MultiByteToWideChar(CP_UNIXCP, 0, filename, -1, slash, filename_len);
918 if (elf_check_debug_link(p, fmap_link, crc)) goto found;
920 /* testing execdir/.debug/filename */
921 memcpy(slash, dotDebugW, sizeof(dotDebugW));
922 MultiByteToWideChar(CP_UNIXCP, 0, filename, -1, slash + sizeof(dotDebugW) / sizeof(WCHAR), filename_len);
923 if (elf_check_debug_link(p, fmap_link, crc)) goto found;
925 /* testing globaldebugdir/execdir/filename */
926 memmove(p + globalDebugDirLen, p, (slash - p) * sizeof(WCHAR));
927 memcpy(p, globalDebugDirW, globalDebugDirLen * sizeof(WCHAR));
928 slash += globalDebugDirLen;
929 MultiByteToWideChar(CP_UNIXCP, 0, filename, -1, slash, filename_len);
930 if (elf_check_debug_link(p, fmap_link, crc)) goto found;
932 /* finally testing filename */
933 if (elf_check_debug_link(slash, fmap_link, crc)) goto found;
936 WARN("Couldn't locate or map %s\n", filename);
937 HeapFree(GetProcessHeap(), 0, p);
938 HeapFree(GetProcessHeap(), 0, fmap_link);
942 TRACE("Located debug information file %s at %s\n", filename, debugstr_w(p));
943 HeapFree(GetProcessHeap(), 0, p);
944 fmap->alternate = fmap_link;
948 /******************************************************************
949 * elf_debuglink_parse
951 * Parses a .gnu_debuglink section and loads the debug info from
952 * the external file specified there.
954 static BOOL elf_debuglink_parse(struct elf_file_map* fmap, struct module* module,
955 const BYTE* debuglink)
957 /* The content of a debug link section is:
958 * 1/ a NULL terminated string, containing the file name for the
960 * 2/ padding on 4 byte boundary
961 * 3/ CRC of the linked ELF file
963 const char* dbg_link = (char*)debuglink;
966 crc = *(const DWORD*)(dbg_link + ((DWORD_PTR)(strlen(dbg_link) + 4) & ~3));
967 return elf_locate_debug_link(fmap, dbg_link, module->module.LoadedImageName, crc);
970 /******************************************************************
971 * elf_load_debug_info_from_map
973 * Loads the symbolic information from ELF module which mapping is described
975 * the module has been loaded at 'load_offset' address, so symbols' address
976 * relocation is performed.
977 * CRC is checked if fmap->with_crc is TRUE
979 * 0 if the file doesn't contain symbolic info (or this info cannot be
983 static BOOL elf_load_debug_info_from_map(struct module* module,
984 struct elf_file_map* fmap,
986 struct hash_table* ht_symtab)
988 BOOL ret = FALSE, lret;
989 struct elf_thunk_area thunks[] =
991 {"__wine_spec_import_thunks", THUNK_ORDINAL_NOTYPE, 0, 0}, /* inter DLL calls */
992 {"__wine_spec_delayed_import_loaders", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
993 {"__wine_spec_delayed_import_thunks", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
994 {"__wine_delay_load", THUNK_ORDINAL_LOAD, 0, 0}, /* delayed inter DLL calls */
995 {"__wine_spec_thunk_text_16", -16, 0, 0}, /* 16 => 32 thunks */
996 {"__wine_spec_thunk_text_32", -32, 0, 0}, /* 32 => 16 thunks */
1000 module->module.SymType = SymExport;
1002 /* create a hash table for the symtab */
1003 elf_hash_symtab(module, pool, ht_symtab, fmap, thunks);
1005 if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
1007 struct elf_section_map stab_sect, stabstr_sect;
1008 struct elf_section_map debug_sect, debug_str_sect, debug_abbrev_sect,
1009 debug_line_sect, debug_loclist_sect;
1010 struct elf_section_map debuglink_sect;
1012 /* if present, add the .gnu_debuglink file as an alternate to current one */
1013 if (elf_find_section(fmap, ".gnu_debuglink", SHT_NULL, &debuglink_sect))
1015 const BYTE* dbg_link;
1017 dbg_link = (const BYTE*)elf_map_section(&debuglink_sect);
1018 if (dbg_link != ELF_NO_MAP)
1020 lret = elf_debuglink_parse(fmap, module, dbg_link);
1022 WARN("Couldn't load linked debug file for %s\n",
1023 debugstr_w(module->module.ModuleName));
1026 elf_unmap_section(&debuglink_sect);
1028 if (elf_find_section(fmap, ".stab", SHT_NULL, &stab_sect) &&
1029 elf_find_section(fmap, ".stabstr", SHT_NULL, &stabstr_sect))
1032 const char* stabstr;
1034 stab = elf_map_section(&stab_sect);
1035 stabstr = elf_map_section(&stabstr_sect);
1036 if (stab != ELF_NO_MAP && stabstr != ELF_NO_MAP)
1038 /* OK, now just parse all of the stabs. */
1039 lret = stabs_parse(module, module->elf_info->elf_addr,
1040 stab, elf_get_map_size(&stab_sect),
1041 stabstr, elf_get_map_size(&stabstr_sect));
1043 /* and fill in the missing information for stabs */
1044 elf_finish_stabs_info(module, ht_symtab);
1046 WARN("Couldn't correctly read stabs\n");
1050 elf_unmap_section(&stab_sect);
1051 elf_unmap_section(&stabstr_sect);
1053 if (elf_find_section(fmap, ".debug_info", SHT_NULL, &debug_sect))
1055 /* Dwarf 2 debug information */
1056 const BYTE* dw2_debug;
1057 const BYTE* dw2_debug_abbrev;
1058 const BYTE* dw2_debug_str;
1059 const BYTE* dw2_debug_line;
1060 const BYTE* dw2_debug_loclist;
1062 TRACE("Loading Dwarf2 information for %s\n", debugstr_w(module->module.ModuleName));
1064 elf_find_section(fmap, ".debug_str", SHT_NULL, &debug_str_sect);
1065 elf_find_section(fmap, ".debug_abbrev", SHT_NULL, &debug_abbrev_sect);
1066 elf_find_section(fmap, ".debug_line", SHT_NULL, &debug_line_sect);
1067 elf_find_section(fmap, ".debug_loc", SHT_NULL, &debug_loclist_sect);
1069 dw2_debug = (const BYTE*)elf_map_section(&debug_sect);
1070 dw2_debug_abbrev = (const BYTE*)elf_map_section(&debug_abbrev_sect);
1071 dw2_debug_str = (const BYTE*)elf_map_section(&debug_str_sect);
1072 dw2_debug_line = (const BYTE*)elf_map_section(&debug_line_sect);
1073 dw2_debug_loclist = (const BYTE*)elf_map_section(&debug_loclist_sect);
1074 if (dw2_debug != ELF_NO_MAP && dw2_debug_abbrev != ELF_NO_MAP && dw2_debug_str != ELF_NO_MAP)
1076 /* OK, now just parse dwarf2 debug infos. */
1077 lret = dwarf2_parse(module, module->elf_info->elf_addr, thunks,
1078 dw2_debug, elf_get_map_size(&debug_sect),
1079 dw2_debug_abbrev, elf_get_map_size(&debug_abbrev_sect),
1080 dw2_debug_str, elf_get_map_size(&debug_str_sect),
1081 dw2_debug_line, elf_get_map_size(&debug_line_sect),
1082 dw2_debug_loclist, elf_get_map_size(&debug_loclist_sect));
1085 WARN("Couldn't correctly read stabs\n");
1088 elf_unmap_section(&debug_sect);
1089 elf_unmap_section(&debug_abbrev_sect);
1090 elf_unmap_section(&debug_str_sect);
1091 elf_unmap_section(&debug_line_sect);
1092 elf_unmap_section(&debug_loclist_sect);
1095 if (strstrW(module->module.ModuleName, S_ElfW) ||
1096 !strcmpW(module->module.ModuleName, S_WineLoaderW))
1098 /* add the thunks for native libraries */
1099 if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
1100 elf_new_wine_thunks(module, ht_symtab, thunks);
1102 /* add all the public symbols from symtab */
1103 if (elf_new_public_symbols(module, ht_symtab) && !ret) ret = TRUE;
1108 /******************************************************************
1109 * elf_load_debug_info
1111 * Loads ELF debugging information from the module image file.
1113 BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
1117 struct hash_table ht_symtab;
1118 struct elf_file_map my_fmap;
1120 if (module->type != DMT_ELF || !module->elf_info)
1122 ERR("Bad elf module '%s'\n", debugstr_w(module->module.LoadedImageName));
1126 pool_init(&pool, 65536);
1127 hash_table_init(&pool, &ht_symtab, 256);
1132 ret = elf_map_file(module->module.LoadedImageName, fmap);
1135 ret = elf_load_debug_info_from_map(module, fmap, &pool, &ht_symtab);
1137 pool_destroy(&pool);
1138 if (fmap == &my_fmap) elf_unmap_file(fmap);
1142 /******************************************************************
1143 * elf_fetch_file_info
1145 * Gathers some more information for an ELF module from a given file
1147 BOOL elf_fetch_file_info(const WCHAR* name, DWORD* base,
1148 DWORD* size, DWORD* checksum)
1150 struct elf_file_map fmap;
1152 if (!elf_map_file(name, &fmap)) return FALSE;
1153 if (base) *base = fmap.elf_start;
1154 *size = fmap.elf_size;
1155 *checksum = calc_crc32(&fmap);
1156 elf_unmap_file(&fmap);
1160 /******************************************************************
1163 * Loads the information for ELF module stored in 'filename'
1164 * the module has been loaded at 'load_offset' address
1166 * -1 if the file cannot be found/opened
1167 * 0 if the file doesn't contain symbolic info (or this info cannot be
1171 static BOOL elf_load_file(struct process* pcs, const WCHAR* filename,
1172 unsigned long load_offset, struct elf_info* elf_info)
1175 struct elf_file_map fmap;
1177 TRACE("Processing elf file '%s' at %08lx\n", debugstr_w(filename), load_offset);
1179 if (!elf_map_file(filename, &fmap)) goto leave;
1181 /* Next, we need to find a few of the internal ELF headers within
1182 * this thing. We need the main executable header, and the section
1185 if (!fmap.elf_start && !load_offset)
1186 ERR("Relocatable ELF %s, but no load address. Loading at 0x0000000\n",
1187 debugstr_w(filename));
1188 if (fmap.elf_start && load_offset)
1190 WARN("Non-relocatable ELF %s, but load address of 0x%08lx supplied. "
1191 "Assuming load address is corrupt\n", debugstr_w(filename), load_offset);
1195 if (elf_info->flags & ELF_INFO_DEBUG_HEADER)
1197 struct elf_section_map esm;
1199 if (elf_find_section(&fmap, ".dynamic", SHT_DYNAMIC, &esm))
1202 char* ptr = (char*)fmap.sect[esm.sidx].shdr.sh_addr;
1207 if (!ReadProcessMemory(pcs->handle, ptr, &dyn, sizeof(dyn), &len) ||
1210 if (dyn.d_tag == DT_DEBUG)
1212 elf_info->dbg_hdr_addr = dyn.d_un.d_ptr;
1216 } while (dyn.d_tag != DT_NULL);
1217 if (dyn.d_tag == DT_NULL) goto leave;
1219 elf_end_find(&fmap);
1222 if (elf_info->flags & ELF_INFO_MODULE)
1224 struct elf_module_info *elf_module_info =
1225 HeapAlloc(GetProcessHeap(), 0, sizeof(struct elf_module_info));
1226 if (!elf_module_info) goto leave;
1227 elf_info->module = module_new(pcs, filename, DMT_ELF, FALSE,
1228 (load_offset) ? load_offset : fmap.elf_start,
1229 fmap.elf_size, 0, calc_crc32(&fmap));
1230 if (!elf_info->module)
1232 HeapFree(GetProcessHeap(), 0, elf_module_info);
1235 elf_info->module->elf_info = elf_module_info;
1236 elf_info->module->elf_info->elf_addr = load_offset;
1238 if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
1240 elf_info->module->module.SymType = SymDeferred;
1243 else ret = elf_load_debug_info(elf_info->module, &fmap);
1245 elf_info->module->elf_info->elf_mark = 1;
1246 elf_info->module->elf_info->elf_loader = 0;
1249 if (elf_info->flags & ELF_INFO_NAME)
1252 ptr = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(filename) + 1) * sizeof(WCHAR));
1255 strcpyW(ptr, filename);
1256 elf_info->module_name = ptr;
1261 elf_unmap_file(&fmap);
1266 /******************************************************************
1267 * elf_load_file_from_path
1268 * tries to load an ELF file from a set of paths (separated by ':')
1270 static BOOL elf_load_file_from_path(HANDLE hProcess,
1271 const WCHAR* filename,
1272 unsigned long load_offset,
1274 struct elf_info* elf_info)
1278 WCHAR* pathW = NULL;
1281 if (!path) return FALSE;
1283 len = MultiByteToWideChar(CP_UNIXCP, 0, path, -1, NULL, 0);
1284 pathW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
1285 if (!pathW) return FALSE;
1286 MultiByteToWideChar(CP_UNIXCP, 0, path, -1, pathW, len);
1288 for (s = pathW; s && *s; s = (t) ? (t+1) : NULL)
1290 t = strchrW(s, ':');
1292 fn = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(filename) + 1 + lstrlenW(s) + 1) * sizeof(WCHAR));
1295 strcatW(fn, S_SlashW);
1296 strcatW(fn, filename);
1297 ret = elf_load_file(hProcess, fn, load_offset, elf_info);
1298 HeapFree(GetProcessHeap(), 0, fn);
1300 s = (t) ? (t+1) : NULL;
1303 HeapFree(GetProcessHeap(), 0, pathW);
1307 /******************************************************************
1308 * elf_load_file_from_dll_path
1310 * Tries to load an ELF file from the dll path
1312 static BOOL elf_load_file_from_dll_path(HANDLE hProcess,
1313 const WCHAR* filename,
1314 unsigned long load_offset,
1315 struct elf_info* elf_info)
1318 unsigned int index = 0;
1321 while (!ret && (path = wine_dll_enum_load_path( index++ )))
1326 len = MultiByteToWideChar(CP_UNIXCP, 0, path, -1, NULL, 0);
1328 name = HeapAlloc( GetProcessHeap(), 0,
1329 (len + lstrlenW(filename) + 2) * sizeof(WCHAR) );
1332 MultiByteToWideChar(CP_UNIXCP, 0, path, -1, name, len);
1333 strcatW( name, S_SlashW );
1334 strcatW( name, filename );
1335 ret = elf_load_file(hProcess, name, load_offset, elf_info);
1336 HeapFree( GetProcessHeap(), 0, name );
1341 /******************************************************************
1342 * elf_search_and_load_file
1344 * lookup a file in standard ELF locations, and if found, load it
1346 static BOOL elf_search_and_load_file(struct process* pcs, const WCHAR* filename,
1347 unsigned long load_offset,
1348 struct elf_info* elf_info)
1351 struct module* module;
1352 static WCHAR S_libstdcPPW[] = {'l','i','b','s','t','d','c','+','+','\0'};
1354 if (filename == NULL || *filename == '\0') return FALSE;
1355 if ((module = module_is_already_loaded(pcs, filename)))
1357 elf_info->module = module;
1358 module->elf_info->elf_mark = 1;
1359 return module->module.SymType;
1362 if (strstrW(filename, S_libstdcPPW)) return FALSE; /* We know we can't do it */
1363 ret = elf_load_file(pcs, filename, load_offset, elf_info);
1364 /* if relative pathname, try some absolute base dirs */
1365 if (!ret && !strchrW(filename, '/'))
1367 ret = elf_load_file_from_path(pcs, filename, load_offset,
1368 getenv("PATH"), elf_info) ||
1369 elf_load_file_from_path(pcs, filename, load_offset,
1370 getenv("LD_LIBRARY_PATH"), elf_info);
1371 if (!ret) ret = elf_load_file_from_dll_path(pcs, filename, load_offset, elf_info);
1377 /******************************************************************
1378 * elf_enum_modules_internal
1380 * Enumerate ELF modules from a running process
1382 static BOOL elf_enum_modules_internal(const struct process* pcs,
1383 const WCHAR* main_name,
1384 elf_enum_modules_cb cb, void* user)
1386 struct r_debug dbg_hdr;
1390 WCHAR bufstrW[MAX_PATH];
1392 if (!pcs->dbg_hdr_addr ||
1393 !ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr,
1394 &dbg_hdr, sizeof(dbg_hdr), NULL))
1397 /* Now walk the linked list. In all known ELF implementations,
1398 * the dynamic loader maintains this linked list for us. In some
1399 * cases the first entry doesn't appear with a name, in other cases it
1402 for (lm_addr = (void*)dbg_hdr.r_map; lm_addr; lm_addr = (void*)lm.l_next)
1404 if (!ReadProcessMemory(pcs->handle, lm_addr, &lm, sizeof(lm), NULL))
1407 if (lm.l_prev != NULL && /* skip first entry, normally debuggee itself */
1408 lm.l_name != NULL &&
1409 ReadProcessMemory(pcs->handle, lm.l_name, bufstr, sizeof(bufstr), NULL))
1411 bufstr[sizeof(bufstr) - 1] = '\0';
1412 MultiByteToWideChar(CP_UNIXCP, 0, bufstr, -1, bufstrW, sizeof(bufstrW) / sizeof(WCHAR));
1413 if (main_name && !bufstrW[0]) strcpyW(bufstrW, main_name);
1414 if (!cb(bufstrW, (unsigned long)lm.l_addr, user)) break;
1422 struct process* pcs;
1423 struct elf_info elf_info;
1426 static BOOL elf_enum_sync_cb(const WCHAR* name, unsigned long addr, void* user)
1428 struct elf_sync* es = user;
1430 elf_search_and_load_file(es->pcs, name, addr, &es->elf_info);
1434 /******************************************************************
1435 * elf_synchronize_module_list
1437 * this functions rescans the debuggee module's list and synchronizes it with
1438 * the one from 'pcs', ie:
1439 * - if a module is in debuggee and not in pcs, it's loaded into pcs
1440 * - if a module is in pcs and not in debuggee, it's unloaded from pcs
1442 BOOL elf_synchronize_module_list(struct process* pcs)
1444 struct module* module;
1447 for (module = pcs->lmodules; module; module = module->next)
1449 if (module->type == DMT_ELF && !module->is_virtual)
1450 module->elf_info->elf_mark = 0;
1454 es.elf_info.flags = ELF_INFO_MODULE;
1455 if (!elf_enum_modules_internal(pcs, NULL, elf_enum_sync_cb, &es))
1458 module = pcs->lmodules;
1461 if (module->type == DMT_ELF && !module->is_virtual &&
1462 !module->elf_info->elf_mark && !module->elf_info->elf_loader)
1464 module_remove(pcs, module);
1465 /* restart all over */
1466 module = pcs->lmodules;
1468 else module = module->next;
1473 /******************************************************************
1476 * Lookup in a running ELF process the loader, and sets its ELF link
1477 * address (for accessing the list of loaded .so libs) in pcs.
1478 * If flags is ELF_INFO_MODULE, the module for the loader is also
1479 * added as a module into pcs.
1481 static BOOL elf_search_loader(struct process* pcs, struct elf_info* elf_info)
1486 /* All binaries are loaded with WINELOADER (if run from tree) or by the
1487 * main executable (either wine-kthread or wine-pthread)
1488 * FIXME: the heuristic used to know whether we need to load wine-pthread
1489 * or wine-kthread is not 100% safe
1491 if ((ptr = getenv("WINELOADER")))
1493 WCHAR tmp[MAX_PATH];
1494 MultiByteToWideChar(CP_ACP, 0, ptr, -1, tmp, sizeof(tmp) / sizeof(WCHAR));
1495 ret = elf_search_and_load_file(pcs, tmp, 0, elf_info);
1499 ret = elf_search_and_load_file(pcs, S_WineKThreadW, 0, elf_info) ||
1500 elf_search_and_load_file(pcs, S_WinePThreadW, 0, elf_info);
1505 /******************************************************************
1506 * elf_read_wine_loader_dbg_info
1508 * Try to find a decent wine executable which could have loaded the debuggee
1510 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1512 struct elf_info elf_info;
1514 elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_MODULE;
1515 if (!elf_search_loader(pcs, &elf_info)) return FALSE;
1516 elf_info.module->elf_info->elf_loader = 1;
1517 module_set_module(elf_info.module, S_WineLoaderW);
1518 return (pcs->dbg_hdr_addr = elf_info.dbg_hdr_addr) != 0;
1521 /******************************************************************
1524 * Enumerates the ELF loaded modules from a running target (hProc)
1525 * This function doesn't require that someone has called SymInitialize
1526 * on this very process.
1528 BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb cb, void* user)
1531 struct elf_info elf_info;
1534 memset(&pcs, 0, sizeof(pcs));
1536 elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_NAME;
1537 if (!elf_search_loader(&pcs, &elf_info)) return FALSE;
1538 pcs.dbg_hdr_addr = elf_info.dbg_hdr_addr;
1539 ret = elf_enum_modules_internal(&pcs, elf_info.module_name, cb, user);
1540 HeapFree(GetProcessHeap(), 0, (char*)elf_info.module_name);
1546 struct process* pcs;
1547 struct elf_info elf_info;
1552 /******************************************************************
1555 * Callback for elf_load_module, used to walk the list of loaded
1558 static BOOL elf_load_cb(const WCHAR* name, unsigned long addr, void* user)
1560 struct elf_load* el = user;
1563 /* memcmp is needed for matches when bufstr contains also version information
1564 * el->name: libc.so, name: libc.so.6.0
1566 p = strrchrW(name, '/');
1568 if (!memcmp(p, el->name, lstrlenW(el->name) * sizeof(WCHAR)))
1570 el->ret = elf_search_and_load_file(el->pcs, name, addr, &el->elf_info);
1576 /******************************************************************
1579 * loads an ELF module and stores it in process' module list
1580 * Also, find module real name and load address from
1581 * the real loaded modules list in pcs address space
1583 struct module* elf_load_module(struct process* pcs, const WCHAR* name, unsigned long addr)
1587 TRACE("(%p %s %08lx)\n", pcs, debugstr_w(name), addr);
1589 el.elf_info.flags = ELF_INFO_MODULE;
1592 if (pcs->dbg_hdr_addr) /* we're debugging a life target */
1595 /* do only the lookup from the filename, not the path (as we lookup module
1596 * name in the process' loaded module list)
1598 el.name = strrchrW(name, '/');
1599 if (!el.name++) el.name = name;
1602 if (!elf_enum_modules_internal(pcs, NULL, elf_load_cb, &el))
1608 el.ret = elf_search_and_load_file(pcs, el.name, addr, &el.elf_info);
1610 if (!el.ret) return NULL;
1611 assert(el.elf_info.module);
1612 return el.elf_info.module;
1615 #else /* !__ELF__ */
1617 BOOL elf_synchronize_module_list(struct process* pcs)
1622 BOOL elf_fetch_file_info(const WCHAR* name, DWORD* base,
1623 DWORD* size, DWORD* checksum)
1628 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1633 BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb cb, void* user)
1638 struct module* elf_load_module(struct process* pcs, const WCHAR* name, unsigned long addr)
1643 BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
1648 int elf_is_in_thunk_area(unsigned long addr,
1649 const struct elf_thunk_area* thunks)
1653 #endif /* __ELF__ */