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