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