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