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