wined3d: Allow SetCursorProperties on existing cursor.
[wine] / dlls / dbghelp / elf_module.c
1 /*
2  * File elf.c - processing of ELF files
3  *
4  * Copyright (C) 1996, Eric Youngdale.
5  *               1999-2007 Eric Pouech
6  *
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.
11  *
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.
16  *
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
20  */
21
22 #include "config.h"
23 #include "wine/port.h"
24
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
31
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
48
49 #include "dbghelp_private.h"
50
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
74
75 #include "wine/library.h"
76 #include "wine/debug.h"
77
78 struct elf_module_info
79 {
80     unsigned long               elf_addr;
81     unsigned short              elf_mark : 1,
82                                 elf_loader : 1;
83 };
84
85 #ifdef __ELF__
86
87 #define ELF_INFO_DEBUG_HEADER   0x0001
88 #define ELF_INFO_MODULE         0x0002
89 #define ELF_INFO_NAME           0x0004
90
91 WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
92
93 struct elf_info
94 {
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) */
99 };
100
101 /* structure holding information while handling an ELF image
102  * allows one by one section mapping for memory savings
103  */
104 struct elf_file_map
105 {
106     Elf32_Ehdr                  elfhdr;
107     size_t                      elf_size;
108     size_t                      elf_start;
109     struct
110     {
111         Elf32_Shdr                      shdr;
112         const char*                     mapped;
113     }*                          sect;
114     int                         fd;
115     const char*                 shstrtab;
116     struct elf_file_map*        alternate;      /* another ELF file (linked to this one) */
117 };
118
119 struct elf_section_map
120 {
121     struct elf_file_map*        fmap;
122     unsigned                    sidx;
123 };
124
125 struct symtab_elt
126 {
127     struct hash_table_elt       ht_elt;
128     const Elf32_Sym*            symp;
129     struct symt_compiland*      compiland;
130     unsigned                    used;
131 };
132
133 struct elf_thunk_area
134 {
135     const char*                 symname;
136     THUNK_ORDINAL               ordinal;
137     unsigned long               rva_start;
138     unsigned long               rva_end;
139 };
140
141 /******************************************************************
142  *              elf_map_section
143  *
144  * Maps a single section into memory from an ELF file
145  */
146 static const char* elf_map_section(struct elf_section_map* esm)
147 {
148     unsigned pgsz = getpagesize();
149     unsigned ofst, size;
150
151     if (esm->sidx < 0 || esm->sidx >= esm->fmap->elfhdr.e_shnum ||
152         esm->fmap->sect[esm->sidx].shdr.sh_type == SHT_NOBITS)
153         return ELF_NO_MAP;
154
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));
163 }
164
165 /******************************************************************
166  *              elf_find_section
167  *
168  * Finds a section by name (and type) into memory from an ELF file
169  * or its alternate if any
170  */
171 static BOOL elf_find_section(struct elf_file_map* fmap, const char* name,
172                              unsigned sht, struct elf_section_map* esm)
173 {
174     unsigned i;
175
176     while (fmap)
177     {
178         if (fmap->shstrtab == ELF_NO_MAP)
179         {
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;
183         }
184         for (i = 0; i < fmap->elfhdr.e_shnum; i++)
185         {
186             if (strcmp(fmap->shstrtab + fmap->sect[i].shdr.sh_name, name) == 0 &&
187                 (sht == SHT_NULL || sht == fmap->sect[i].shdr.sh_type))
188             {
189                 esm->fmap = fmap;
190                 esm->sidx = i;
191                 return TRUE;
192             }
193         }
194         fmap = fmap->alternate;
195     }
196     return FALSE;
197 }
198
199 /******************************************************************
200  *              elf_unmap_section
201  *
202  * Unmaps a single section from memory
203  */
204 static void elf_unmap_section(struct elf_section_map* esm)
205 {
206     if (esm->sidx >= 0 && esm->sidx < esm->fmap->elfhdr.e_shnum && esm->fmap->sect[esm->sidx].mapped != ELF_NO_MAP)
207     {
208         unsigned pgsz = getpagesize();
209         unsigned ofst, size;
210
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;
217     }
218 }
219
220 static void elf_end_find(struct elf_file_map* fmap)
221 {
222     struct elf_section_map      esm;
223
224     while (fmap)
225     {
226         esm.fmap = fmap;
227         esm.sidx = fmap->elfhdr.e_shstrndx;
228         elf_unmap_section(&esm);
229         fmap->shstrtab = ELF_NO_MAP;
230         fmap = fmap->alternate;
231     }
232 }
233
234 /******************************************************************
235  *              elf_get_map_size
236  *
237  * Get the size of an ELF section
238  */
239 static inline unsigned elf_get_map_size(struct elf_section_map* esm)
240 {
241     if (esm->sidx < 0 || esm->sidx >= esm->fmap->elfhdr.e_shnum)
242         return 0;
243     return esm->fmap->sect[esm->sidx].shdr.sh_size;
244 }
245
246 /******************************************************************
247  *              elf_map_file
248  *
249  * Maps an ELF file into memory (and checks it's a real ELF file)
250  */
251 static BOOL elf_map_file(const WCHAR* filenameW, struct elf_file_map* fmap)
252 {
253     static const BYTE   elf_signature[4] = { ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3 };
254     struct stat         statbuf;
255     int                 i;
256     Elf32_Phdr          phdr;
257     unsigned            tmp, page_mask = getpagesize() - 1;
258     char*               filename;
259     unsigned            len;
260     BOOL                ret = FALSE;
261
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);
265
266     fmap->fd = -1;
267     fmap->shstrtab = ELF_NO_MAP;
268     fmap->alternate = NULL;
269
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;
272
273     /* Now open the file, so that we can mmap() it. */
274     if ((fmap->fd = open(filename, O_RDONLY)) == -1) goto done;
275
276     if (read(fmap->fd, &fmap->elfhdr, sizeof(fmap->elfhdr)) != sizeof(fmap->elfhdr))
277         goto done;
278     /* and check for an ELF header */
279     if (memcmp(fmap->elfhdr.e_ident, 
280                elf_signature, sizeof(elf_signature))) goto done;
281
282     fmap->sect = HeapAlloc(GetProcessHeap(), 0,
283                            fmap->elfhdr.e_shnum * sizeof(fmap->sect[0]));
284     if (!fmap->sect) goto done;
285
286     lseek(fmap->fd, fmap->elfhdr.e_shoff, SEEK_SET);
287     for (i = 0; i < fmap->elfhdr.e_shnum; i++)
288     {
289         read(fmap->fd, &fmap->sect[i].shdr, sizeof(fmap->sect[i].shdr));
290         fmap->sect[i].mapped = ELF_NO_MAP;
291     }
292
293     /* grab size of module once loaded in memory */
294     lseek(fmap->fd, fmap->elfhdr.e_phoff, SEEK_SET);
295     fmap->elf_size = 0; 
296     fmap->elf_start = ~0L;
297     for (i = 0; i < fmap->elfhdr.e_phnum; i++)
298     {
299         if (read(fmap->fd, &phdr, sizeof(phdr)) == sizeof(phdr) && 
300             phdr.p_type == PT_LOAD)
301         {
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;
305         }
306     }
307     /* if non relocatable ELF, then remove fixed address from computation
308      * otherwise, all addresses are zero based and start has no effect
309      */
310     fmap->elf_size -= fmap->elf_start;
311     ret = TRUE;
312 done:
313     HeapFree(GetProcessHeap(), 0, filename);
314     return ret;
315 }
316
317 /******************************************************************
318  *              elf_unmap_file
319  *
320  * Unmaps an ELF file from memory (previously mapped with elf_map_file)
321  */
322 static void elf_unmap_file(struct elf_file_map* fmap)
323 {
324     while (fmap)
325     {
326         if (fmap->fd != -1)
327         {
328             struct elf_section_map  esm;
329             esm.fmap = fmap;
330             for (esm.sidx = 0; esm.sidx < fmap->elfhdr.e_shnum; esm.sidx++)
331             {
332                 elf_unmap_section(&esm);
333             }
334             HeapFree(GetProcessHeap(), 0, fmap->sect);
335             close(fmap->fd);
336         }
337         fmap = fmap->alternate;
338     }
339 }
340
341 /******************************************************************
342  *              elf_is_in_thunk_area
343  *
344  * Check whether an address lies within one of the thunk area we
345  * know of.
346  */
347 int elf_is_in_thunk_area(unsigned long addr,
348                          const struct elf_thunk_area* thunks)
349 {
350     unsigned i;
351
352     for (i = 0; thunks[i].symname; i++)
353     {
354         if (addr >= thunks[i].rva_start && addr < thunks[i].rva_end)
355             return i;
356     }
357     return -1;
358 }
359
360 /******************************************************************
361  *              elf_hash_symtab
362  *
363  * creating an internal hash table to ease use ELF symtab information lookup
364  */
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)
368 {
369     int                         i, j, nsym;
370     const char*                 strp;
371     const char*                 symname;
372     struct symt_compiland*      compiland = NULL;
373     const char*                 ptr;
374     const Elf32_Sym*            symp;
375     struct symtab_elt*          ste;
376     struct elf_section_map      esm, esm_str;
377
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;
381     esm_str.fmap = fmap;
382     esm_str.sidx = fmap->sect[esm.sidx].shdr.sh_link;
383     if ((strp = elf_map_section(&esm_str)) == ELF_NO_MAP) return;
384
385     nsym = elf_get_map_size(&esm) / sizeof(*symp);
386
387     for (j = 0; thunks[j].symname; j++)
388         thunks[j].rva_start = thunks[j].rva_end = 0;
389
390     for (i = 0; i < nsym; i++, symp++)
391     {
392         /* Ignore certain types of entries which really aren't of that much
393          * interest.
394          */
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)
400         {
401             continue;
402         }
403
404         symname = strp + symp->st_name;
405
406         /* handle some specific symtab (that we'll throw away when done) */
407         switch (ELF32_ST_TYPE(symp->st_info))
408         {
409         case STT_FILE:
410             if (symname)
411                 compiland = symt_new_compiland(module, symp->st_value,
412                                                source_new(module, NULL, symname));
413             else
414                 compiland = NULL;
415             continue;
416         case STT_NOTYPE:
417             /* we are only interested in wine markers inserted by winebuild */
418             for (j = 0; thunks[j].symname; j++)
419             {
420                 if (!strcmp(symname, thunks[j].symname))
421                 {
422                     thunks[j].rva_start = symp->st_value;
423                     thunks[j].rva_end   = symp->st_value + symp->st_size;
424                     break;
425                 }
426             }
427             continue;
428         }
429
430         /* FIXME: we don't need to handle them (GCC internals)
431          * Moreover, they screw up our symbol lookup :-/
432          */
433         if (symname[0] == '.' && symname[1] == 'L' && isdigit(symname[2]))
434             continue;
435
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)
444          */
445         ptr = symname + strlen(symname) - 1;
446         if (isdigit(*ptr))
447         {
448             while (isdigit(*ptr) && ptr >= symname) ptr--;
449             if (ptr > symname && *ptr == '.')
450             {
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;
455             }
456         }
457         ste->symp        = symp;
458         ste->compiland   = compiland;
459         ste->used        = 0;
460         hash_table_add(ht_symtab, &ste->ht_elt);
461     }
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
464      * with this ELF file
465      */
466 }
467
468 /******************************************************************
469  *              elf_lookup_symtab
470  *
471  * lookup a symbol by name in our internal hash table for the symtab
472  */
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)
476 {
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;
483     const char*                 base;
484
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.)
488      */
489     if (compiland)
490     {
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;
495     }
496     else compiland_name = compiland_basename = NULL;
497     
498     hash_table_iter_init(ht_symtab, &hti, name);
499     while ((ste = hash_table_iter_up(&hti)))
500     {
501         if (ste->used || strcmp(ste->ht_elt.name, name)) continue;
502
503         weak_result = ste;
504         if ((ste->compiland && !compiland_name) || (!ste->compiland && compiland_name))
505             continue;
506         if (ste->compiland && compiland_name)
507         {
508             const char* filename = source_get(module, ste->compiland->source);
509             if (strcmp(filename, compiland_name))
510             {
511                 base = strrchr(filename, '/');
512                 if (!base++) base = filename;
513                 if (strcmp(base, compiland_basename)) continue;
514             }
515         }
516         if (result)
517         {
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);
522         }
523         else
524         {
525             result = ste;
526             ste->used = 1;
527         }
528     }
529     if (!result && !(result = weak_result))
530     {
531         FIXME("Couldn't find symbol %s!%s in symtab\n",
532               debugstr_w(module->module.ModuleName), name);
533         return NULL;
534     }
535     return result->symp;
536 }
537
538 /******************************************************************
539  *              elf_finish_stabs_info
540  *
541  * - get any relevant information (address & size) from the bits we got from the
542  *   stabs debugging information
543  */
544 static void elf_finish_stabs_info(struct module* module, struct hash_table* symtab)
545 {
546     struct hash_table_iter      hti;
547     void*                       ptr;
548     struct symt_ht*             sym;
549     const Elf32_Sym*            symp;
550
551     hash_table_iter_init(&module->ht_symbols, &hti, NULL);
552     while ((ptr = hash_table_iter_up(&hti)))
553     {
554         sym = GET_ENTRY(ptr, struct symt_ht, hash_elt);
555         switch (sym->symt.tag)
556         {
557         case SymTagFunction:
558             if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
559                 ((struct symt_function*)sym)->size)
560             {
561                 break;
562             }
563             symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name, 
564                                      ((struct symt_function*)sym)->container);
565             if (symp)
566             {
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);
576
577                 ((struct symt_function*)sym)->address = module->elf_info->elf_addr +
578                                                         symp->st_value;
579                 ((struct symt_function*)sym)->size    = symp->st_size;
580             } else
581                 FIXME("Couldn't find %s!%s\n",
582                       debugstr_w(module->module.ModuleName), sym->hash_elt.name);
583             break;
584         case SymTagData:
585             switch (((struct symt_data*)sym)->kind)
586             {
587             case DataIsGlobal:
588             case DataIsFileStatic:
589                 if (((struct symt_data*)sym)->u.var.offset != module->elf_info->elf_addr)
590                     break;
591                 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name, 
592                                          ((struct symt_data*)sym)->container);
593                 if (symp)
594                 {
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 +
601                                                           symp->st_value;
602                     ((struct symt_data*)sym)->kind = (ELF32_ST_BIND(symp->st_info) == STB_LOCAL) ?
603                         DataIsFileStatic : DataIsGlobal;
604                 } else
605                     FIXME("Couldn't find %s!%s\n",
606                           debugstr_w(module->module.ModuleName), sym->hash_elt.name);
607                 break;
608             default:;
609             }
610             break;
611         default:
612             FIXME("Unsupported tag %u\n", sym->symt.tag);
613             break;
614         }
615     }
616     /* since we may have changed some addresses & sizes, mark the module to be resorted */
617     module->sortlist_valid = FALSE;
618 }
619
620 /******************************************************************
621  *              elf_load_wine_thunks
622  *
623  * creating the thunk objects for a wine native DLL
624  */
625 static int elf_new_wine_thunks(struct module* module, struct hash_table* ht_symtab,
626                                const struct elf_thunk_area* thunks)
627 {
628     int                         j;
629     struct hash_table_iter      hti;
630     struct symtab_elt*          ste;
631     DWORD                       addr;
632     struct symt_ht*             symt;
633
634     hash_table_iter_init(ht_symtab, &hti, NULL);
635     while ((ste = hash_table_iter_up(&hti)))
636     {
637         if (ste->used) continue;
638
639         addr = module->elf_info->elf_addr + ste->symp->st_value;
640
641         j = elf_is_in_thunk_area(ste->symp->st_value, thunks);
642         if (j >= 0) /* thunk found */
643         {
644             symt_new_thunk(module, ste->compiland, ste->ht_elt.name, thunks[j].ordinal,
645                            addr, ste->symp->st_size);
646         }
647         else
648         {
649             ULONG64     ref_addr;
650
651             symt = symt_find_nearest(module, addr);
652             if (symt)
653                 symt_get_info(&symt->symt, TI_GET_ADDRESS, &ref_addr);
654             if (!symt || addr != ref_addr)
655             {
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
659                  */
660                 switch (ELF32_ST_TYPE(ste->symp->st_info))
661                 {
662                 case STT_FUNC:
663                     symt_new_function(module, ste->compiland, ste->ht_elt.name,
664                                       addr, ste->symp->st_size, NULL);
665                     break;
666                 case STT_OBJECT:
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);
670                     break;
671                 default:
672                     FIXME("Shouldn't happen\n");
673                     break;
674                 }
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
680                  * is rather bad
681                  */
682                 module->sortlist_valid = TRUE;
683             }
684             else if (strcmp(ste->ht_elt.name, symt->hash_elt.name))
685             {
686                 ULONG64 xaddr = 0, xsize = 0;
687                 DWORD   kind = -1;
688
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);
692
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
697                  */
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,
703                           symt->hash_elt.name,
704                           wine_dbgstr_longlong(xaddr), wine_dbgstr_longlong(xsize));
705             }
706         }
707     }
708     /* see comment above */
709     module->sortlist_valid = FALSE;
710     return TRUE;
711 }
712
713 /******************************************************************
714  *              elf_new_public_symbols
715  *
716  * Creates a set of public symbols from an ELF symtab
717  */
718 static int elf_new_public_symbols(struct module* module, struct hash_table* symtab)
719 {
720     struct hash_table_iter      hti;
721     struct symtab_elt*          ste;
722
723     if (dbghelp_options & SYMOPT_NO_PUBLICS) return TRUE;
724
725     /* FIXME: we're missing the ELF entry point here */
726
727     hash_table_iter_init(symtab, &hti, NULL);
728     while ((ste = hash_table_iter_up(&hti)))
729     {
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);
734     }
735     return TRUE;
736 }
737
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
740    restriction. */
741
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 \**********************************************************************/
753
754 /* First, the polynomial itself and its table of feedback terms.  The  */
755 /* polynomial is                                                       */
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.                                                    */
761
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.                  */
773
774 /* The feedback terms table consists of 256, 32-bit entries.  Notes:   */
775 /*                                                                     */
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.     */
780 /*                                                                     */
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.)          */
788 /*                                                                     */
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. */
791 /*                                                                     */
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.                                   */
796
797
798 static DWORD calc_crc32(struct elf_file_map* fmap)
799 {
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
846     };
847     int                 i, r;
848     unsigned char       buffer[256];
849     DWORD               crc = ~0;
850
851     lseek(fmap->fd, 0, SEEK_SET);
852     while ((r = read(fmap->fd, buffer, sizeof(buffer))) > 0)
853     {
854         for (i = 0; i < r; i++) crc = UPDC32(buffer[i], crc);
855     }
856     return ~crc;
857 #undef UPDC32
858 }
859
860 static BOOL elf_check_debug_link(const WCHAR* file, struct elf_file_map* fmap, DWORD crc)
861 {
862     BOOL        ret;
863     if (!elf_map_file(file, fmap)) return FALSE;
864     if (!(ret = crc == calc_crc32(fmap)))
865     {
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);
869     }
870     return ret;
871 }
872
873 /******************************************************************
874  *              elf_locate_debug_link
875  *
876  * Locate a filename from a .gnu_debuglink section, using the same
877  * strategy as gdb:
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)
891  */
892 static BOOL elf_locate_debug_link(struct elf_file_map* fmap, const char* filename,
893                                   const WCHAR* loaded_file, DWORD crc)
894 {
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);
898     size_t filename_len;
899     WCHAR* p = NULL;
900     WCHAR* slash;
901     struct elf_file_map* fmap_link = NULL;
902
903     fmap_link = HeapAlloc(GetProcessHeap(), 0, sizeof(*fmap_link));
904     if (!fmap_link) return FALSE;
905
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));
909     if (!p) goto found;
910
911     /* we prebuild the string with "execdir" */
912     strcpyW(p, loaded_file);
913     slash = strrchrW(p, '/');
914     if (slash == NULL) slash = p; else slash++;
915
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;
919
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;
924
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;
931
932     /* finally testing filename */
933     if (elf_check_debug_link(slash, fmap_link, crc)) goto found;
934
935
936     WARN("Couldn't locate or map %s\n", filename);
937     HeapFree(GetProcessHeap(), 0, p);
938     HeapFree(GetProcessHeap(), 0, fmap_link);
939     return FALSE;
940
941 found:
942     TRACE("Located debug information file %s at %s\n", filename, debugstr_w(p));
943     HeapFree(GetProcessHeap(), 0, p);
944     fmap->alternate = fmap_link;
945     return TRUE;
946 }
947
948 /******************************************************************
949  *              elf_debuglink_parse
950  *
951  * Parses a .gnu_debuglink section and loads the debug info from
952  * the external file specified there.
953  */
954 static BOOL elf_debuglink_parse(struct elf_file_map* fmap, struct module* module,
955                                 const BYTE* debuglink)
956 {
957     /* The content of a debug link section is:
958      * 1/ a NULL terminated string, containing the file name for the
959      *    debug info
960      * 2/ padding on 4 byte boundary
961      * 3/ CRC of the linked ELF file
962      */
963     const char* dbg_link = (char*)debuglink;
964     DWORD crc;
965
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);
968 }
969
970 /******************************************************************
971  *              elf_load_debug_info_from_map
972  *
973  * Loads the symbolic information from ELF module which mapping is described
974  * in fmap
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
978  * returns
979  *      0 if the file doesn't contain symbolic info (or this info cannot be
980  *      read or parsed)
981  *      1 on success
982  */
983 static BOOL elf_load_debug_info_from_map(struct module* module, 
984                                          struct elf_file_map* fmap,
985                                          struct pool* pool,
986                                          struct hash_table* ht_symtab)
987 {
988     BOOL                ret = FALSE, lret;
989     struct elf_thunk_area thunks[] = 
990     {
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 */
997         {NULL,                                  0,                    0, 0}
998     };
999
1000     module->module.SymType = SymExport;
1001
1002     /* create a hash table for the symtab */
1003     elf_hash_symtab(module, pool, ht_symtab, fmap, thunks);
1004
1005     if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
1006     {
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;
1011
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))
1014         {
1015             const BYTE* dbg_link;
1016
1017             dbg_link = (const BYTE*)elf_map_section(&debuglink_sect);
1018             if (dbg_link != ELF_NO_MAP)
1019             {
1020                 lret = elf_debuglink_parse(fmap, module, dbg_link);
1021                 if (!lret)
1022                     WARN("Couldn't load linked debug file for %s\n",
1023                          debugstr_w(module->module.ModuleName));
1024                 ret = ret || lret;
1025             }
1026             elf_unmap_section(&debuglink_sect);
1027         }
1028         if (elf_find_section(fmap, ".stab", SHT_NULL, &stab_sect) &&
1029             elf_find_section(fmap, ".stabstr", SHT_NULL, &stabstr_sect))
1030         {
1031             const char* stab;
1032             const char* stabstr;
1033
1034             stab = elf_map_section(&stab_sect);
1035             stabstr = elf_map_section(&stabstr_sect);
1036             if (stab != ELF_NO_MAP && stabstr != ELF_NO_MAP)
1037             {
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));
1042                 if (lret)
1043                     /* and fill in the missing information for stabs */
1044                     elf_finish_stabs_info(module, ht_symtab);
1045                 else
1046                     WARN("Couldn't correctly read stabs\n");
1047                 ret = ret || lret;
1048             }
1049             else lret = FALSE;
1050             elf_unmap_section(&stab_sect);
1051             elf_unmap_section(&stabstr_sect);
1052         }
1053         if (elf_find_section(fmap, ".debug_info", SHT_NULL, &debug_sect))
1054         {
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;
1061
1062             TRACE("Loading Dwarf2 information for %s\n", debugstr_w(module->module.ModuleName));
1063
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);
1068
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)
1075             {
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));
1083
1084                 if (!lret)
1085                     WARN("Couldn't correctly read stabs\n");
1086                 ret = ret || lret;
1087             }
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);
1093         }
1094     }
1095     if (strstrW(module->module.ModuleName, S_ElfW) ||
1096         !strcmpW(module->module.ModuleName, S_WineLoaderW))
1097     {
1098         /* add the thunks for native libraries */
1099         if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
1100             elf_new_wine_thunks(module, ht_symtab, thunks);
1101     }
1102     /* add all the public symbols from symtab */
1103     if (elf_new_public_symbols(module, ht_symtab) && !ret) ret = TRUE;
1104
1105     return ret;
1106 }
1107
1108 /******************************************************************
1109  *              elf_load_debug_info
1110  *
1111  * Loads ELF debugging information from the module image file.
1112  */
1113 BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
1114 {
1115     BOOL                ret = TRUE;
1116     struct pool         pool;
1117     struct hash_table   ht_symtab;
1118     struct elf_file_map my_fmap;
1119
1120     if (module->type != DMT_ELF || !module->elf_info)
1121     {
1122         ERR("Bad elf module '%s'\n", debugstr_w(module->module.LoadedImageName));
1123         return FALSE;
1124     }
1125
1126     pool_init(&pool, 65536);
1127     hash_table_init(&pool, &ht_symtab, 256);
1128
1129     if (!fmap)
1130     {
1131         fmap = &my_fmap;
1132         ret = elf_map_file(module->module.LoadedImageName, fmap);
1133     }
1134     if (ret)
1135         ret = elf_load_debug_info_from_map(module, fmap, &pool, &ht_symtab);
1136
1137     pool_destroy(&pool);
1138     if (fmap == &my_fmap) elf_unmap_file(fmap);
1139     return ret;
1140 }
1141
1142 /******************************************************************
1143  *              elf_fetch_file_info
1144  *
1145  * Gathers some more information for an ELF module from a given file
1146  */
1147 BOOL elf_fetch_file_info(const WCHAR* name, DWORD* base,
1148                          DWORD* size, DWORD* checksum)
1149 {
1150     struct elf_file_map fmap;
1151
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);
1157     return TRUE;
1158 }
1159
1160 /******************************************************************
1161  *              elf_load_file
1162  *
1163  * Loads the information for ELF module stored in 'filename'
1164  * the module has been loaded at 'load_offset' address
1165  * returns
1166  *      -1 if the file cannot be found/opened
1167  *      0 if the file doesn't contain symbolic info (or this info cannot be
1168  *      read or parsed)
1169  *      1 on success
1170  */
1171 static BOOL elf_load_file(struct process* pcs, const WCHAR* filename,
1172                           unsigned long load_offset, struct elf_info* elf_info)
1173 {
1174     BOOL                ret = FALSE;
1175     struct elf_file_map fmap;
1176
1177     TRACE("Processing elf file '%s' at %08lx\n", debugstr_w(filename), load_offset);
1178
1179     if (!elf_map_file(filename, &fmap)) goto leave;
1180
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
1183      * table.
1184      */
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)
1189     {
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);
1192         load_offset = 0;
1193     }
1194
1195     if (elf_info->flags & ELF_INFO_DEBUG_HEADER)
1196     {
1197         struct elf_section_map  esm;
1198
1199         if (elf_find_section(&fmap, ".dynamic", SHT_DYNAMIC, &esm))
1200         {
1201             Elf32_Dyn       dyn;
1202             char*           ptr = (char*)fmap.sect[esm.sidx].shdr.sh_addr;
1203             unsigned long   len;
1204
1205             do
1206             {
1207                 if (!ReadProcessMemory(pcs->handle, ptr, &dyn, sizeof(dyn), &len) ||
1208                     len != sizeof(dyn))
1209                     goto leave;
1210                 if (dyn.d_tag == DT_DEBUG)
1211                 {
1212                     elf_info->dbg_hdr_addr = dyn.d_un.d_ptr;
1213                     break;
1214                 }
1215                 ptr += sizeof(dyn);
1216             } while (dyn.d_tag != DT_NULL);
1217             if (dyn.d_tag == DT_NULL) goto leave;
1218         }
1219         elf_end_find(&fmap);
1220     }
1221
1222     if (elf_info->flags & ELF_INFO_MODULE)
1223     {
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)
1231         {
1232             HeapFree(GetProcessHeap(), 0, elf_module_info);
1233             goto leave;
1234         }
1235         elf_info->module->elf_info = elf_module_info;
1236         elf_info->module->elf_info->elf_addr = load_offset;
1237
1238         if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
1239         {
1240             elf_info->module->module.SymType = SymDeferred;
1241             ret = TRUE;
1242         }
1243         else ret = elf_load_debug_info(elf_info->module, &fmap);
1244
1245         elf_info->module->elf_info->elf_mark = 1;
1246         elf_info->module->elf_info->elf_loader = 0;
1247     } else ret = TRUE;
1248
1249     if (elf_info->flags & ELF_INFO_NAME)
1250     {
1251         WCHAR*  ptr;
1252         ptr = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(filename) + 1) * sizeof(WCHAR));
1253         if (ptr)
1254         {
1255             strcpyW(ptr, filename);
1256             elf_info->module_name = ptr;
1257         }
1258         else ret = FALSE;
1259     }
1260 leave:
1261     elf_unmap_file(&fmap);
1262
1263     return ret;
1264 }
1265
1266 /******************************************************************
1267  *              elf_load_file_from_path
1268  * tries to load an ELF file from a set of paths (separated by ':')
1269  */
1270 static BOOL elf_load_file_from_path(HANDLE hProcess,
1271                                     const WCHAR* filename,
1272                                     unsigned long load_offset,
1273                                     const char* path,
1274                                     struct elf_info* elf_info)
1275 {
1276     BOOL                ret = FALSE;
1277     WCHAR               *s, *t, *fn;
1278     WCHAR*              pathW = NULL;
1279     unsigned            len;
1280
1281     if (!path) return FALSE;
1282
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);
1287
1288     for (s = pathW; s && *s; s = (t) ? (t+1) : NULL)
1289     {
1290         t = strchrW(s, ':');
1291         if (t) *t = '\0';
1292         fn = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(filename) + 1 + lstrlenW(s) + 1) * sizeof(WCHAR));
1293         if (!fn) break;
1294         strcpyW(fn, s);
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);
1299         if (ret) break;
1300         s = (t) ? (t+1) : NULL;
1301     }
1302
1303     HeapFree(GetProcessHeap(), 0, pathW);
1304     return ret;
1305 }
1306
1307 /******************************************************************
1308  *              elf_load_file_from_dll_path
1309  *
1310  * Tries to load an ELF file from the dll path
1311  */
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)
1316 {
1317     BOOL ret = FALSE;
1318     unsigned int index = 0;
1319     const char *path;
1320
1321     while (!ret && (path = wine_dll_enum_load_path( index++ )))
1322     {
1323         WCHAR *name;
1324         unsigned len;
1325
1326         len = MultiByteToWideChar(CP_UNIXCP, 0, path, -1, NULL, 0);
1327
1328         name = HeapAlloc( GetProcessHeap(), 0,
1329                           (len + lstrlenW(filename) + 2) * sizeof(WCHAR) );
1330
1331         if (!name) break;
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 );
1337     }
1338     return ret;
1339 }
1340
1341 /******************************************************************
1342  *              elf_search_and_load_file
1343  *
1344  * lookup a file in standard ELF locations, and if found, load it
1345  */
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)
1349 {
1350     BOOL                ret = FALSE;
1351     struct module*      module;
1352     static WCHAR        S_libstdcPPW[] = {'l','i','b','s','t','d','c','+','+','\0'};
1353
1354     if (filename == NULL || *filename == '\0') return FALSE;
1355     if ((module = module_is_already_loaded(pcs, filename)))
1356     {
1357         elf_info->module = module;
1358         module->elf_info->elf_mark = 1;
1359         return module->module.SymType;
1360     }
1361
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, '/'))
1366     {
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);
1372     }
1373     
1374     return ret;
1375 }
1376
1377 /******************************************************************
1378  *              elf_enum_modules_internal
1379  *
1380  * Enumerate ELF modules from a running process
1381  */
1382 static BOOL elf_enum_modules_internal(const struct process* pcs,
1383                                       const WCHAR* main_name,
1384                                       elf_enum_modules_cb cb, void* user)
1385 {
1386     struct r_debug      dbg_hdr;
1387     void*               lm_addr;
1388     struct link_map     lm;
1389     char                bufstr[256];
1390     WCHAR               bufstrW[MAX_PATH];
1391
1392     if (!pcs->dbg_hdr_addr ||
1393         !ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr,
1394                            &dbg_hdr, sizeof(dbg_hdr), NULL))
1395         return FALSE;
1396
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
1400      * does.
1401      */
1402     for (lm_addr = (void*)dbg_hdr.r_map; lm_addr; lm_addr = (void*)lm.l_next)
1403     {
1404         if (!ReadProcessMemory(pcs->handle, lm_addr, &lm, sizeof(lm), NULL))
1405             return FALSE;
1406
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))
1410         {
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;
1415         }
1416     }
1417     return TRUE;
1418 }
1419
1420 struct elf_sync
1421 {
1422     struct process*     pcs;
1423     struct elf_info     elf_info;
1424 };
1425
1426 static BOOL elf_enum_sync_cb(const WCHAR* name, unsigned long addr, void* user)
1427 {
1428     struct elf_sync*    es = user;
1429
1430     elf_search_and_load_file(es->pcs, name, addr, &es->elf_info);
1431     return TRUE;
1432 }
1433
1434 /******************************************************************
1435  *              elf_synchronize_module_list
1436  *
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
1441  */
1442 BOOL    elf_synchronize_module_list(struct process* pcs)
1443 {
1444     struct module*      module;
1445     struct elf_sync     es;
1446
1447     for (module = pcs->lmodules; module; module = module->next)
1448     {
1449         if (module->type == DMT_ELF && !module->is_virtual)
1450             module->elf_info->elf_mark = 0;
1451     }
1452
1453     es.pcs = pcs;
1454     es.elf_info.flags = ELF_INFO_MODULE;
1455     if (!elf_enum_modules_internal(pcs, NULL, elf_enum_sync_cb, &es))
1456         return FALSE;
1457
1458     module = pcs->lmodules;
1459     while (module)
1460     {
1461         if (module->type == DMT_ELF && !module->is_virtual &&
1462             !module->elf_info->elf_mark && !module->elf_info->elf_loader)
1463         {
1464             module_remove(pcs, module);
1465             /* restart all over */
1466             module = pcs->lmodules;
1467         }
1468         else module = module->next;
1469     }
1470     return TRUE;
1471 }
1472
1473 /******************************************************************
1474  *              elf_search_loader
1475  *
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.
1480  */
1481 static BOOL elf_search_loader(struct process* pcs, struct elf_info* elf_info)
1482 {
1483     BOOL                ret;
1484     const char*         ptr;
1485
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
1490      */
1491     if ((ptr = getenv("WINELOADER")))
1492     {
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);
1496     }
1497     else
1498     {
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);
1501     }
1502     return ret;
1503 }
1504
1505 /******************************************************************
1506  *              elf_read_wine_loader_dbg_info
1507  *
1508  * Try to find a decent wine executable which could have loaded the debuggee
1509  */
1510 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1511 {
1512     struct elf_info     elf_info;
1513
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;
1519 }
1520
1521 /******************************************************************
1522  *              elf_enum_modules
1523  *
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.
1527  */
1528 BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb cb, void* user)
1529 {
1530     struct process      pcs;
1531     struct elf_info     elf_info;
1532     BOOL                ret;
1533
1534     memset(&pcs, 0, sizeof(pcs));
1535     pcs.handle = hProc;
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);
1541     return ret;
1542 }
1543
1544 struct elf_load
1545 {
1546     struct process*     pcs;
1547     struct elf_info     elf_info;
1548     const WCHAR*        name;
1549     BOOL                ret;
1550 };
1551
1552 /******************************************************************
1553  *              elf_load_cb
1554  *
1555  * Callback for elf_load_module, used to walk the list of loaded
1556  * modules.
1557  */
1558 static BOOL elf_load_cb(const WCHAR* name, unsigned long addr, void* user)
1559 {
1560     struct elf_load*    el = user;
1561     const WCHAR*        p;
1562
1563     /* memcmp is needed for matches when bufstr contains also version information
1564      * el->name: libc.so, name: libc.so.6.0
1565      */
1566     p = strrchrW(name, '/');
1567     if (!p++) p = name;
1568     if (!memcmp(p, el->name, lstrlenW(el->name) * sizeof(WCHAR)))
1569     {
1570         el->ret = elf_search_and_load_file(el->pcs, name, addr, &el->elf_info);
1571         return FALSE;
1572     }
1573     return TRUE;
1574 }
1575
1576 /******************************************************************
1577  *              elf_load_module
1578  *
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
1582  */
1583 struct module*  elf_load_module(struct process* pcs, const WCHAR* name, unsigned long addr)
1584 {
1585     struct elf_load     el;
1586
1587     TRACE("(%p %s %08lx)\n", pcs, debugstr_w(name), addr);
1588
1589     el.elf_info.flags = ELF_INFO_MODULE;
1590     el.ret = FALSE;
1591
1592     if (pcs->dbg_hdr_addr) /* we're debugging a life target */
1593     {
1594         el.pcs = pcs;
1595         /* do only the lookup from the filename, not the path (as we lookup module
1596          * name in the process' loaded module list)
1597          */
1598         el.name = strrchrW(name, '/');
1599         if (!el.name++) el.name = name;
1600         el.ret = FALSE;
1601
1602         if (!elf_enum_modules_internal(pcs, NULL, elf_load_cb, &el))
1603             return NULL;
1604     }
1605     else if (addr)
1606     {
1607         el.name = name;
1608         el.ret = elf_search_and_load_file(pcs, el.name, addr, &el.elf_info);
1609     }
1610     if (!el.ret) return NULL;
1611     assert(el.elf_info.module);
1612     return el.elf_info.module;
1613 }
1614
1615 #else   /* !__ELF__ */
1616
1617 BOOL    elf_synchronize_module_list(struct process* pcs)
1618 {
1619     return FALSE;
1620 }
1621
1622 BOOL elf_fetch_file_info(const WCHAR* name, DWORD* base,
1623                          DWORD* size, DWORD* checksum)
1624 {
1625     return FALSE;
1626 }
1627
1628 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1629 {
1630     return FALSE;
1631 }
1632
1633 BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb cb, void* user)
1634 {
1635     return FALSE;
1636 }
1637
1638 struct module*  elf_load_module(struct process* pcs, const WCHAR* name, unsigned long addr)
1639 {
1640     return NULL;
1641 }
1642
1643 BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
1644 {
1645     return FALSE;
1646 }
1647
1648 int elf_is_in_thunk_area(unsigned long addr,
1649                          const struct elf_thunk_area* thunks)
1650 {
1651     return -1;
1652 }
1653 #endif  /* __ELF__ */