mshtml: Added IHTMLTextAreaElement implementation.
[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     const char*                 filename;
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(const 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     const char*                 filename = 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             filename = symname;
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->filename    = filename;
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->filename && !compiland_name) || (!ste->filename && compiland_name))
381             continue;
382         if (ste->filename && compiland_name)
383         {
384             if (strcmp(ste->filename, compiland_name))
385             {
386                 base = strrchr(ste->filename, '/');
387                 if (!base++) base = ste->filename;
388                 if (strcmp(base, compiland_basename)) continue;
389             }
390         }
391         if (result)
392         {
393             FIXME("Already found symbol %s (%s) in symtab %s @%08x and %s @%08x\n", 
394                   name, compiland_name, result->filename, result->symp->st_value,
395                   ste->filename, ste->symp->st_value);
396         }
397         else
398         {
399             result = ste;
400             ste->used = 1;
401         }
402     }
403     if (!result && !(result = weak_result))
404     {
405         FIXME("Couldn't find symbol %s!%s in symtab\n", 
406               module->module.ModuleName, name);
407         return NULL;
408     }
409     return result->symp;
410 }
411
412 /******************************************************************
413  *              elf_finish_stabs_info
414  *
415  * - get any relevant information (address & size) from the bits we got from the
416  *   stabs debugging information
417  */
418 static void elf_finish_stabs_info(struct module* module, struct hash_table* symtab)
419 {
420     struct hash_table_iter      hti;
421     void*                       ptr;
422     struct symt_ht*             sym;
423     const Elf32_Sym*            symp;
424
425     hash_table_iter_init(&module->ht_symbols, &hti, NULL);
426     while ((ptr = hash_table_iter_up(&hti)))
427     {
428         sym = GET_ENTRY(ptr, struct symt_ht, hash_elt);
429         switch (sym->symt.tag)
430         {
431         case SymTagFunction:
432             if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
433                 ((struct symt_function*)sym)->size)
434             {
435                 break;
436             }
437             symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name, 
438                                      ((struct symt_function*)sym)->container);
439             if (symp)
440             {
441                 if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
442                     ((struct symt_function*)sym)->address != module->elf_info->elf_addr + symp->st_value)
443                     FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n", 
444                           sym, module->module.ModuleName, sym->hash_elt.name, 
445                           ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
446                 if (((struct symt_function*)sym)->size && ((struct symt_function*)sym)->size != symp->st_size)
447                     FIXME("Changing size for %p/%s!%s from %08lx to %08x\n", 
448                           sym, module->module.ModuleName, sym->hash_elt.name,
449                           ((struct symt_function*)sym)->size, symp->st_size);
450
451                 ((struct symt_function*)sym)->address = module->elf_info->elf_addr +
452                                                         symp->st_value;
453                 ((struct symt_function*)sym)->size    = symp->st_size;
454             } else FIXME("Couldn't find %s!%s\n", module->module.ModuleName, sym->hash_elt.name);
455             break;
456         case SymTagData:
457             switch (((struct symt_data*)sym)->kind)
458             {
459             case DataIsGlobal:
460             case DataIsFileStatic:
461                 if (((struct symt_data*)sym)->u.address != module->elf_info->elf_addr)
462                     break;
463                 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name, 
464                                          ((struct symt_data*)sym)->container);
465                 if (symp)
466                 {
467                 if (((struct symt_data*)sym)->u.address != module->elf_info->elf_addr &&
468                     ((struct symt_data*)sym)->u.address != module->elf_info->elf_addr + symp->st_value)
469                     FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n", 
470                           sym, module->module.ModuleName, sym->hash_elt.name, 
471                           ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
472                     ((struct symt_data*)sym)->u.address = module->elf_info->elf_addr +
473                                                           symp->st_value;
474                     ((struct symt_data*)sym)->kind = (ELF32_ST_BIND(symp->st_info) == STB_LOCAL) ?
475                         DataIsFileStatic : DataIsGlobal;
476                 } else FIXME("Couldn't find %s!%s\n", module->module.ModuleName, sym->hash_elt.name);
477                 break;
478             default:;
479             }
480             break;
481         default:
482             FIXME("Unsupported tag %u\n", sym->symt.tag);
483             break;
484         }
485     }
486     /* since we may have changed some addresses & sizes, mark the module to be resorted */
487     module->sortlist_valid = FALSE;
488 }
489
490 /******************************************************************
491  *              elf_load_wine_thunks
492  *
493  * creating the thunk objects for a wine native DLL
494  */
495 static int elf_new_wine_thunks(struct module* module, struct hash_table* ht_symtab,
496                                unsigned num_areas, struct thunk_area* thunks)
497 {
498     int                         j;
499     struct symt_compiland*      compiland = NULL;
500     const char*                 compiland_name = NULL;
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         /* FIXME: this is not a good idea anyway... we are creating several
512          * compiland objects for a same compilation unit
513          * We try to cache the last compiland used, but it's not enough
514          * (we should here only create compilands if they are not yet 
515          *  defined)
516          */
517         if (!compiland_name || compiland_name != ste->filename)
518             compiland = symt_new_compiland(module, 
519                                            compiland_name = ste->filename);
520
521         addr = module->elf_info->elf_addr + ste->symp->st_value;
522
523         for (j = 0; j < num_areas; j++)
524         {
525             if (ste->symp->st_value >= thunks[j].rva_start && 
526                 ste->symp->st_value < thunks[j].rva_end)
527                 break;
528         }
529         if (j < num_areas) /* thunk found */
530         {
531             symt_new_thunk(module, compiland, ste->ht_elt.name, thunks[j].ordinal,
532                            addr, ste->symp->st_size);
533         }
534         else
535         {
536             ULONG64     ref_addr;
537
538             idx = symt_find_nearest(module, addr);
539             if (idx != -1)
540                 symt_get_info(&module->addr_sorttab[idx]->symt, 
541                               TI_GET_ADDRESS, &ref_addr);
542             if (idx == -1 || addr != ref_addr)
543             {
544                 /* creating public symbols for all the ELF symbols which haven't been
545                  * used yet (ie we have no debug information on them)
546                  * That's the case, for example, of the .spec.c files
547                  */
548                 switch (ELF32_ST_TYPE(ste->symp->st_info))
549                 {
550                 case STT_FUNC:
551                     symt_new_function(module, compiland, ste->ht_elt.name,
552                                       addr, ste->symp->st_size, NULL);
553                     break;
554                 case STT_OBJECT:
555                     symt_new_global_variable(module, compiland, ste->ht_elt.name,
556                                              ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL,
557                                              addr, ste->symp->st_size, NULL);
558                     break;
559                 default:
560                     FIXME("Shouldn't happen\n");
561                     break;
562                 }
563                 /* FIXME: this is a hack !!!
564                  * we are adding new symbols, but as we're parsing a symbol table
565                  * (hopefully without duplicate symbols) we delay rebuilding the sorted
566                  * module table until we're done with the symbol table
567                  * Otherwise, as we intertwine symbols's add and lookup, performance
568                  * is rather bad
569                  */
570                 module->sortlist_valid = TRUE;
571             }
572             else if (strcmp(ste->ht_elt.name, module->addr_sorttab[idx]->hash_elt.name))
573             {
574                 ULONG64 xaddr = 0, xsize = 0;
575                 DWORD   kind = -1;
576
577                 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_ADDRESS,  &xaddr);
578                 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_LENGTH,   &xsize);
579                 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_DATAKIND, &kind);
580
581                 /* If none of symbols has a correct size, we consider they are both markers
582                  * Hence, we can silence this warning
583                  * Also, we check that we don't have two symbols, one local, the other 
584                  * global which is legal
585                  */
586                 if ((xsize || ste->symp->st_size) && 
587                     (kind == (ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL) ? DataIsFileStatic : DataIsGlobal))
588                     FIXME("Duplicate in %s: %s<%08lx-%08x> %s<%s-%s>\n", 
589                           module->module.ModuleName,
590                           ste->ht_elt.name, addr, ste->symp->st_size,
591                           module->addr_sorttab[idx]->hash_elt.name,
592                           wine_dbgstr_longlong(xaddr), wine_dbgstr_longlong(xsize));
593             }
594         }
595     }
596     /* see comment above */
597     module->sortlist_valid = FALSE;
598     return TRUE;
599 }
600
601 /******************************************************************
602  *              elf_new_public_symbols
603  *
604  * Creates a set of public symbols from an ELF symtab
605  */
606 static int elf_new_public_symbols(struct module* module, struct hash_table* symtab)
607 {
608     struct symt_compiland*      compiland = NULL;
609     const char*                 compiland_name = NULL;
610     struct hash_table_iter      hti;
611     struct symtab_elt*          ste;
612
613     if (dbghelp_options & SYMOPT_NO_PUBLICS) return TRUE;
614
615     /* FIXME: we're missing the ELF entry point here */
616
617     hash_table_iter_init(symtab, &hti, NULL);
618     while ((ste = hash_table_iter_up(&hti)))
619     {
620         /* FIXME: this is not a good idea anyway... we are creating several
621          * compiland objects for a same compilation unit
622          * We try to cache the last compiland used, but it's not enough
623          * (we should here only create compilands if they are not yet 
624          *  defined)
625          */
626         if (!compiland_name || compiland_name != ste->filename)
627             compiland = symt_new_compiland(module, 
628                                            compiland_name = ste->filename);
629
630         symt_new_public(module, compiland, ste->ht_elt.name,
631                         module->elf_info->elf_addr + ste->symp->st_value,
632                         ste->symp->st_size, TRUE /* FIXME */, 
633                         ELF32_ST_TYPE(ste->symp->st_info) == STT_FUNC);
634     }
635     return TRUE;
636 }
637
638 /* Copyright (C) 1986 Gary S. Brown. Modified by Robert Shearman. You may use
639    the following calc_crc32 code or tables extracted from it, as desired without
640    restriction. */
641
642 /**********************************************************************\
643 |* Demonstration program to compute the 32-bit CRC used as the frame  *|
644 |* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71     *|
645 |* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level     *|
646 |* protocol).  The 32-bit FCS was added via the Federal Register,     *|
647 |* 1 June 1982, p.23798.  I presume but don't know for certain that   *|
648 |* this polynomial is or will be included in CCITT V.41, which        *|
649 |* defines the 16-bit CRC (often called CRC-CCITT) polynomial.  FIPS  *|
650 |* PUB 78 says that the 32-bit FCS reduces otherwise undetected       *|
651 |* errors by a factor of 10^-5 over 16-bit FCS.                       *|
652 \**********************************************************************/
653
654 /* First, the polynomial itself and its table of feedback terms.  The  */
655 /* polynomial is                                                       */
656 /* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */
657 /* Note that we take it "backwards" and put the highest-order term in  */
658 /* the lowest-order bit.  The X^32 term is "implied"; the LSB is the   */
659 /* X^31 term, etc.  The X^0 term (usually shown as "+1") results in    */
660 /* the MSB being 1.                                                    */
661
662 /* Note that the usual hardware shift register implementation, which   */
663 /* is what we're using (we're merely optimizing it by doing eight-bit  */
664 /* chunks at a time) shifts bits into the lowest-order term.  In our   */
665 /* implementation, that means shifting towards the right.  Why do we   */
666 /* do it this way?  Because the calculated CRC must be transmitted in  */
667 /* order from highest-order term to lowest-order term.  UARTs transmit */
668 /* characters in order from LSB to MSB.  By storing the CRC this way,  */
669 /* we hand it to the UART in the order low-byte to high-byte; the UART */
670 /* sends each low-bit to hight-bit; and the result is transmission bit */
671 /* by bit from highest- to lowest-order term without requiring any bit */
672 /* shuffling on our part.  Reception works similarly.                  */
673
674 /* The feedback terms table consists of 256, 32-bit entries.  Notes:   */
675 /*                                                                     */
676 /*  1. The table can be generated at runtime if desired; code to do so */
677 /*     is shown later.  It might not be obvious, but the feedback      */
678 /*     terms simply represent the results of eight shift/xor opera-    */
679 /*     tions for all combinations of data and CRC register values.     */
680 /*                                                                     */
681 /*  2. The CRC accumulation logic is the same for all CRC polynomials, */
682 /*     be they sixteen or thirty-two bits wide.  You simply choose the */
683 /*     appropriate table.  Alternatively, because the table can be     */
684 /*     generated at runtime, you can start by generating the table for */
685 /*     the polynomial in question and use exactly the same "updcrc",   */
686 /*     if your application needn't simultaneously handle two CRC       */
687 /*     polynomials.  (Note, however, that XMODEM is strange.)          */
688 /*                                                                     */
689 /*  3. For 16-bit CRCs, the table entries need be only 16 bits wide;   */
690 /*     of course, 32-bit entries work OK if the high 16 bits are zero. */
691 /*                                                                     */
692 /*  4. The values must be right-shifted by eight bits by the "updcrc"  */
693 /*     logic; the shift must be unsigned (bring in zeroes).  On some   */
694 /*     hardware you could probably optimize the shift in assembler by  */
695 /*     using byte-swap instructions.                                   */
696
697
698 static DWORD calc_crc32(struct elf_file_map* fmap)
699 {
700 #define UPDC32(octet,crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
701     static const DWORD crc_32_tab[] =
702     { /* CRC polynomial 0xedb88320 */
703         0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
704         0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
705         0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
706         0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
707         0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
708         0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
709         0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
710         0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
711         0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
712         0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
713         0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
714         0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
715         0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
716         0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
717         0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
718         0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
719         0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
720         0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
721         0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
722         0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
723         0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
724         0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
725         0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
726         0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
727         0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
728         0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
729         0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
730         0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
731         0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
732         0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
733         0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
734         0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
735         0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
736         0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
737         0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
738         0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
739         0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
740         0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
741         0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
742         0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
743         0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
744         0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
745         0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
746     };
747     int                 i, r;
748     unsigned char       buffer[256];
749     DWORD               crc = ~0;
750
751     lseek(fmap->fd, 0, SEEK_SET);
752     while ((r = read(fmap->fd, buffer, sizeof(buffer))) > 0)
753     {
754         for (i = 0; i < r; i++) crc = UPDC32(buffer[i], crc);
755     }
756     return ~crc;
757 #undef UPDC32
758 }
759
760 /******************************************************************
761  *              elf_load_debug_info_from_map
762  *
763  * Loads the symbolic information from ELF module which mapping is described
764  * in fmap
765  * the module has been loaded at 'load_offset' address, so symbols' address
766  * relocation is performed.
767  * CRC is checked if fmap->with_crc is TRUE
768  * returns
769  *      0 if the file doesn't contain symbolic info (or this info cannot be
770  *      read or parsed)
771  *      1 on success
772  */
773 static BOOL elf_load_debug_info_from_map(struct module* module, 
774                                          struct elf_file_map* fmap,
775                                          struct pool* pool,
776                                          struct hash_table* ht_symtab)
777 {
778     BOOL                ret = FALSE;
779     const char*         shstrtab;
780     int                 i;
781     int                 symtab_sect, dynsym_sect, stab_sect, stabstr_sect;
782     int                 debug_sect, debug_str_sect, debug_abbrev_sect, debug_line_sect;
783     int                 debuglink_sect;
784     struct thunk_area   thunks[] = 
785     {
786         {"__wine_spec_import_thunks",           THUNK_ORDINAL_NOTYPE, 0, 0},    /* inter DLL calls */
787         {"__wine_spec_delayed_import_loaders",  THUNK_ORDINAL_LOAD,   0, 0},    /* delayed inter DLL calls */
788         {"__wine_spec_delayed_import_thunks",   THUNK_ORDINAL_LOAD,   0, 0},    /* delayed inter DLL calls */
789         {"__wine_delay_load",                   THUNK_ORDINAL_LOAD,   0, 0},    /* delayed inter DLL calls */
790         {"__wine_spec_thunk_text_16",           -16,                  0, 0},    /* 16 => 32 thunks */
791         {"__wine_spec_thunk_text_32",           -32,                  0, 0},    /* 32 => 16 thunks */
792         {NULL,                                  0,                    0, 0}
793     };
794
795     if (fmap->with_crc && (fmap->crc != calc_crc32(fmap)))
796     {
797         ERR("Bad CRC for module %s (got %08lx while expecting %08lx)\n",
798             module->module.ImageName, calc_crc32(fmap), fmap->crc);
799         /* we don't tolerate mis-matched files */
800         return FALSE;
801     }
802
803     /*
804      * Next, we need to find a few of the internal ELF headers within
805      * this thing.  We need the main executable header, and the section
806      * table.
807      */
808     shstrtab = elf_map_section(fmap, fmap->elfhdr.e_shstrndx);
809     if (shstrtab == NO_MAP) return FALSE;
810
811     symtab_sect = dynsym_sect = stab_sect = stabstr_sect = -1;
812     debug_sect = debug_str_sect = debug_abbrev_sect = debug_line_sect = -1;
813     debuglink_sect = -1;
814
815     for (i = 0; i < fmap->elfhdr.e_shnum; i++)
816     {
817         if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".stab") == 0)
818             stab_sect = i;
819         if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".stabstr") == 0)
820             stabstr_sect = i;
821         if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_info") == 0)
822             debug_sect = i;
823         if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_str") == 0)
824             debug_str_sect = i;
825         if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_abbrev") == 0)
826             debug_abbrev_sect = i;
827         if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".debug_line") == 0)
828             debug_line_sect = i;
829         if (strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".gnu_debuglink") == 0)
830             debuglink_sect = i;
831         if ((strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".symtab") == 0) &&
832             (fmap->sect[i].shdr.sh_type == SHT_SYMTAB))
833             symtab_sect = i;
834         if ((strcmp(shstrtab + fmap->sect[i].shdr.sh_name, ".dynsym") == 0) &&
835             (fmap->sect[i].shdr.sh_type == SHT_DYNSYM))
836             dynsym_sect = i;
837     }
838     elf_unmap_section(fmap, fmap->elfhdr.e_shstrndx);
839     shstrtab = NULL;
840
841     if (symtab_sect == -1)
842     {
843         /* if we don't have a symtab but a dynsym, process the dynsym
844          * section instead. It'll contain less (relevant) information, 
845          * but it'll be better than nothing
846          */
847         if (dynsym_sect == -1) return FALSE;
848         symtab_sect = dynsym_sect;
849     }
850
851     module->module.SymType = SymExport;
852
853     /* create a hash table for the symtab */
854     elf_hash_symtab(module, pool, ht_symtab, fmap, symtab_sect, thunks);
855
856     if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
857     {
858         if (stab_sect != -1 && stabstr_sect != -1)
859         {
860             const char* stab;
861             const char* stabstr;
862
863             stab = elf_map_section(fmap, stab_sect);
864             stabstr = elf_map_section(fmap, stabstr_sect);
865             if (stab != NO_MAP && stabstr != NO_MAP)
866             {
867                 /* OK, now just parse all of the stabs. */
868                 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 BYTE* dw2_debug;
887             const BYTE* dw2_debug_abbrev;
888             const BYTE* dw2_debug_str;
889
890             FIXME("Alpha-support for Dwarf2 information for %s\n", module->module.ModuleName);
891
892             dw2_debug = (const BYTE*) elf_map_section(fmap, debug_sect);
893             dw2_debug_abbrev = (const BYTE*) elf_map_section(fmap, debug_abbrev_sect);
894             dw2_debug_str = (const BYTE*) 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, FALSE,
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_load_file_from_dll_path
1165  *
1166  * Tries to load an ELF file from the dll path
1167  */
1168 static BOOL elf_load_file_from_dll_path(HANDLE hProcess,
1169                                         const char* filename,
1170                                         unsigned long load_offset,
1171                                         struct elf_info* elf_info)
1172 {
1173     BOOL ret = FALSE;
1174     unsigned int index = 0;
1175     const char *path;
1176
1177     while (!ret && (path = wine_dll_enum_load_path( index++ )))
1178     {
1179         char *name = HeapAlloc( GetProcessHeap(), 0, strlen(path) + strlen(filename) + 2 );
1180         if (!name) break;
1181         strcpy( name, path );
1182         strcat( name, "/" );
1183         strcat( name, filename );
1184         ret = elf_load_file(hProcess, name, load_offset, elf_info);
1185         HeapFree( GetProcessHeap(), 0, name );
1186     }
1187     return ret;
1188 }
1189
1190 /******************************************************************
1191  *              elf_search_and_load_file
1192  *
1193  * lookup a file in standard ELF locations, and if found, load it
1194  */
1195 static BOOL elf_search_and_load_file(struct process* pcs, const char* filename,
1196                                      unsigned long load_offset, 
1197                                      struct elf_info* elf_info)
1198 {
1199     BOOL                ret = FALSE;
1200     struct module*      module;
1201
1202     if (filename == NULL || *filename == '\0') return FALSE;
1203     if ((module = module_find_by_name(pcs, filename, DMT_ELF)))
1204     {
1205         elf_info->module = module;
1206         module->elf_info->elf_mark = 1;
1207         return module->module.SymType;
1208     }
1209
1210     if (strstr(filename, "libstdc++")) return FALSE; /* We know we can't do it */
1211     ret = elf_load_file(pcs, filename, load_offset, elf_info);
1212     /* if relative pathname, try some absolute base dirs */
1213     if (!ret && !strchr(filename, '/'))
1214     {
1215         ret = elf_load_file_from_path(pcs, filename, load_offset, 
1216                                       getenv("PATH"), elf_info) ||
1217             elf_load_file_from_path(pcs, filename, load_offset,
1218                                     getenv("LD_LIBRARY_PATH"), elf_info);
1219         if (!ret) ret = elf_load_file_from_dll_path(pcs, filename, load_offset, elf_info);
1220     }
1221     
1222     return ret;
1223 }
1224
1225 /******************************************************************
1226  *              elf_enum_modules_internal
1227  *
1228  * Enumerate ELF modules from a running process
1229  */
1230 static BOOL elf_enum_modules_internal(const struct process* pcs,
1231                                       const char* main_name,
1232                                       elf_enum_modules_cb cb, void* user)
1233 {
1234     struct r_debug      dbg_hdr;
1235     void*               lm_addr;
1236     struct link_map     lm;
1237     char                bufstr[256];
1238
1239     if (!pcs->dbg_hdr_addr ||
1240         !ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr, 
1241                            &dbg_hdr, sizeof(dbg_hdr), NULL))
1242         return FALSE;
1243
1244     /* Now walk the linked list.  In all known ELF implementations,
1245      * the dynamic loader maintains this linked list for us.  In some
1246      * cases the first entry doesn't appear with a name, in other cases it
1247      * does.
1248      */
1249     for (lm_addr = (void*)dbg_hdr.r_map; lm_addr; lm_addr = (void*)lm.l_next)
1250     {
1251         if (!ReadProcessMemory(pcs->handle, lm_addr, &lm, sizeof(lm), NULL))
1252             return FALSE;
1253
1254         if (lm.l_prev != NULL && /* skip first entry, normally debuggee itself */
1255             lm.l_name != NULL &&
1256             ReadProcessMemory(pcs->handle, lm.l_name, bufstr, sizeof(bufstr), NULL)) 
1257         {
1258             bufstr[sizeof(bufstr) - 1] = '\0';
1259             if (main_name && !bufstr[0]) strcpy(bufstr, main_name);
1260             if (!cb(bufstr, (unsigned long)lm.l_addr, user)) break;
1261         }
1262     }
1263     return TRUE;
1264 }
1265
1266 struct elf_sync
1267 {
1268     struct process*     pcs;
1269     struct elf_info     elf_info;
1270 };
1271
1272 static BOOL elf_enum_sync_cb(const char* name, unsigned long addr, void* user)
1273 {
1274     struct elf_sync*    es = user;
1275
1276     elf_search_and_load_file(es->pcs, name, addr, &es->elf_info);
1277     return TRUE;
1278 }
1279     
1280 /******************************************************************
1281  *              elf_synchronize_module_list
1282  *
1283  * this functions rescans the debuggee module's list and synchronizes it with
1284  * the one from 'pcs', ie:
1285  * - if a module is in debuggee and not in pcs, it's loaded into pcs
1286  * - if a module is in pcs and not in debuggee, it's unloaded from pcs
1287  */
1288 BOOL    elf_synchronize_module_list(struct process* pcs)
1289 {
1290     struct module*      module;
1291     struct elf_sync     es;
1292
1293     for (module = pcs->lmodules; module; module = module->next)
1294     {
1295         if (module->type == DMT_ELF && !module->is_virtual)
1296             module->elf_info->elf_mark = 0;
1297     }
1298
1299     es.pcs = pcs;
1300     es.elf_info.flags = ELF_INFO_MODULE;
1301     if (!elf_enum_modules_internal(pcs, NULL, elf_enum_sync_cb, &es))
1302         return FALSE;
1303
1304     module = pcs->lmodules;
1305     while (module)
1306     {
1307         if (module->type == DMT_ELF && !module->is_virtual &&
1308             !module->elf_info->elf_mark && !module->elf_info->elf_loader)
1309         {
1310             module_remove(pcs, module);
1311             /* restart all over */
1312             module = pcs->lmodules;
1313         }
1314         else module = module->next;
1315     }
1316     return TRUE;
1317 }
1318
1319 /******************************************************************
1320  *              elf_search_loader
1321  *
1322  * Lookup in a running ELF process the loader, and sets its ELF link
1323  * address (for accessing the list of loaded .so libs) in pcs.
1324  * If flags is ELF_INFO_MODULE, the module for the loader is also
1325  * added as a module into pcs.
1326  */
1327 static BOOL elf_search_loader(struct process* pcs, struct elf_info* elf_info)
1328 {
1329     BOOL                ret;
1330     const char*         ptr;
1331
1332     /* All binaries are loaded with WINELOADER (if run from tree) or by the
1333      * main executable (either wine-kthread or wine-pthread)
1334      * FIXME: the heuristic used to know whether we need to load wine-pthread
1335      * or wine-kthread is not 100% safe
1336      */
1337     if ((ptr = getenv("WINELOADER")))
1338         ret = elf_search_and_load_file(pcs, ptr, 0, elf_info);
1339     else 
1340     {
1341         ret = elf_search_and_load_file(pcs, "wine-kthread", 0, elf_info) ||
1342             elf_search_and_load_file(pcs, "wine-pthread", 0, elf_info);
1343     }
1344     return ret;
1345 }
1346
1347 /******************************************************************
1348  *              elf_read_wine_loader_dbg_info
1349  *
1350  * Try to find a decent wine executable which could have loaded the debuggee
1351  */
1352 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1353 {
1354     struct elf_info     elf_info;
1355
1356     elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_MODULE;
1357     if (!elf_search_loader(pcs, &elf_info)) return FALSE;
1358     elf_info.module->elf_info->elf_loader = 1;
1359     strcpy(elf_info.module->module.ModuleName, "<wine-loader>");
1360     return (pcs->dbg_hdr_addr = elf_info.dbg_hdr_addr) != 0;
1361 }
1362
1363 /******************************************************************
1364  *              elf_enum_modules
1365  *
1366  * Enumerates the ELF loaded modules from a running target (hProc)
1367  * This function doesn't require that someone has called SymInitialize
1368  * on this very process.
1369  */
1370 BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb cb, void* user)
1371 {
1372     struct process      pcs;
1373     struct elf_info     elf_info;
1374     BOOL                ret;
1375
1376     memset(&pcs, 0, sizeof(pcs));
1377     pcs.handle = hProc;
1378     elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_NAME;
1379     if (!elf_search_loader(&pcs, &elf_info)) return FALSE;
1380     pcs.dbg_hdr_addr = elf_info.dbg_hdr_addr;
1381     ret = elf_enum_modules_internal(&pcs, elf_info.module_name, cb, user);
1382     HeapFree(GetProcessHeap(), 0, (char*)elf_info.module_name);
1383     return ret;
1384 }
1385
1386 struct elf_load
1387 {
1388     struct process*     pcs;
1389     struct elf_info     elf_info;
1390     const char*         name;
1391     BOOL                ret;
1392 };
1393
1394 /******************************************************************
1395  *              elf_load_cb
1396  *
1397  * Callback for elf_load_module, used to walk the list of loaded
1398  * modules.
1399  */
1400 static BOOL elf_load_cb(const char* name, unsigned long addr, void* user)
1401 {
1402     struct elf_load*    el = user;
1403     const char*         p;
1404
1405     /* memcmp is needed for matches when bufstr contains also version information
1406      * el->name: libc.so, name: libc.so.6.0
1407      */
1408     p = strrchr(name, '/');
1409     if (!p++) p = name;
1410     if (!memcmp(p, el->name, strlen(el->name)))
1411     {
1412         el->ret = elf_search_and_load_file(el->pcs, name, addr, &el->elf_info);
1413         return FALSE;
1414     }
1415     return TRUE;
1416 }
1417
1418 /******************************************************************
1419  *              elf_load_module
1420  *
1421  * loads an ELF module and stores it in process' module list
1422  * Also, find module real name and load address from
1423  * the real loaded modules list in pcs address space
1424  */
1425 struct module*  elf_load_module(struct process* pcs, const char* name, unsigned long addr)
1426 {
1427     struct elf_load     el;
1428
1429     TRACE("(%p %s %08lx)\n", pcs, name, addr);
1430
1431     el.elf_info.flags = ELF_INFO_MODULE;
1432     el.ret = FALSE;
1433
1434     if (pcs->dbg_hdr_addr) /* we're debugging a life target */
1435     {
1436         el.pcs = pcs;
1437         /* do only the lookup from the filename, not the path (as we lookup module
1438          * name in the process' loaded module list)
1439          */
1440         el.name = strrchr(name, '/');
1441         if (!el.name++) el.name = name;
1442         el.ret = FALSE;
1443
1444         if (!elf_enum_modules_internal(pcs, NULL, elf_load_cb, &el))
1445             return NULL;
1446     }
1447     else if (addr)
1448     {
1449         el.ret = elf_search_and_load_file(pcs, name, addr, &el.elf_info);
1450     }
1451     if (!el.ret) return NULL;
1452     assert(el.elf_info.module);
1453     return el.elf_info.module;
1454 }
1455
1456 #else   /* !__ELF__ */
1457
1458 BOOL    elf_synchronize_module_list(struct process* pcs)
1459 {
1460     return FALSE;
1461 }
1462
1463 BOOL elf_fetch_file_info(const char* name, DWORD* base,
1464                          DWORD* size, DWORD* checksum)
1465 {
1466     return FALSE;
1467 }
1468
1469 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1470 {
1471     return FALSE;
1472 }
1473
1474 BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb cb, void* user)
1475 {
1476     return FALSE;
1477 }
1478
1479 struct module*  elf_load_module(struct process* pcs, const char* name, DWORD addr)
1480 {
1481     return NULL;
1482 }
1483
1484 BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
1485 {
1486     return FALSE;
1487 }
1488 #endif  /* __ELF__ */