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