Reverse the order for deleting the items in resetcontent to correctly
[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             ULONG64     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                 ULONG64 xaddr = 0;
407                 DWORD   xsize = 0, kind = -1;
408
409                 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_ADDRESS,  &xaddr);
410                 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_LENGTH,   &xsize);
411                 symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_DATAKIND, &kind);
412
413 #if 0
414                 /* If none of symbols has a correct size, we consider they are both markers
415                  * Hence, we can silence this warning
416                  * Also, we check that we don't have two symbols, one local, the other 
417                  * global which is legal
418                  */
419                 if ((xsize || ste->symp->st_size) && 
420                     (kind == (ELF32_ST_BIND(ste->symp->st_info) == STB_LOCAL) ? DataIsFileStatic : DataIsGlobal))
421                     FIXME("Duplicate in %s: %s<%08lx-%08x> %s<%s-%08lx>\n", 
422                           module->module.ModuleName,
423                           ste->ht_elt.name, addr, ste->symp->st_size,
424                           module->addr_sorttab[idx]->hash_elt.name,
425                           wine_dbgstr_longlong(xaddr), xsize);
426 #endif
427             }
428         }
429     }
430     /* see comment above */
431     module->sortlist_valid = FALSE;
432     return TRUE;
433 }
434
435 /******************************************************************
436  *              elf_new_public_symbols
437  *
438  * Creates a set of public symbols from an ELF symtab
439  */
440 static int elf_new_public_symbols(struct module* module, struct hash_table* symtab)
441 {
442     struct symt_compiland*      compiland = NULL;
443     const char*                 compiland_name = NULL;
444     struct hash_table_iter      hti;
445     struct symtab_elt*          ste;
446
447     if (dbghelp_options & SYMOPT_NO_PUBLICS) return TRUE;
448
449     /* FIXME: we're missing the ELF entry point here */
450
451     hash_table_iter_init(symtab, &hti, NULL);
452     while ((ste = hash_table_iter_up(&hti)))
453     {
454         /* FIXME: this is not a good idea anyway... we are creating several
455          * compiland objects for a same compilation unit
456          * We try to cache the last compiland used, but it's not enough
457          * (we should here only create compilands if they are not yet 
458          *  defined)
459          */
460         if (!compiland_name || compiland_name != ste->filename)
461             compiland = symt_new_compiland(module, 
462                                            compiland_name = ste->filename);
463
464         symt_new_public(module, compiland, ste->ht_elt.name,
465                         module->elf_info->elf_addr + ste->symp->st_value,
466                         ste->symp->st_size, TRUE /* FIXME */, 
467                         ELF32_ST_TYPE(ste->symp->st_info) == STT_FUNC);
468     }
469     return TRUE;
470 }
471
472 /* Copyright (C) 1986 Gary S. Brown. Modified by Robert Shearman. You may use
473    the following calc_crc32 code or tables extracted from it, as desired without
474    restriction. */
475
476 /**********************************************************************\
477 |* Demonstration program to compute the 32-bit CRC used as the frame  *|
478 |* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71     *|
479 |* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level     *|
480 |* protocol).  The 32-bit FCS was added via the Federal Register,     *|
481 |* 1 June 1982, p.23798.  I presume but don't know for certain that   *|
482 |* this polynomial is or will be included in CCITT V.41, which        *|
483 |* defines the 16-bit CRC (often called CRC-CCITT) polynomial.  FIPS  *|
484 |* PUB 78 says that the 32-bit FCS reduces otherwise undetected       *|
485 |* errors by a factor of 10^-5 over 16-bit FCS.                       *|
486 \**********************************************************************/
487
488 /* First, the polynomial itself and its table of feedback terms.  The  */
489 /* polynomial is                                                       */
490 /* 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 */
491 /* Note that we take it "backwards" and put the highest-order term in  */
492 /* the lowest-order bit.  The X^32 term is "implied"; the LSB is the   */
493 /* X^31 term, etc.  The X^0 term (usually shown as "+1") results in    */
494 /* the MSB being 1.                                                    */
495
496 /* Note that the usual hardware shift register implementation, which   */
497 /* is what we're using (we're merely optimizing it by doing eight-bit  */
498 /* chunks at a time) shifts bits into the lowest-order term.  In our   */
499 /* implementation, that means shifting towards the right.  Why do we   */
500 /* do it this way?  Because the calculated CRC must be transmitted in  */
501 /* order from highest-order term to lowest-order term.  UARTs transmit */
502 /* characters in order from LSB to MSB.  By storing the CRC this way,  */
503 /* we hand it to the UART in the order low-byte to high-byte; the UART */
504 /* sends each low-bit to hight-bit; and the result is transmission bit */
505 /* by bit from highest- to lowest-order term without requiring any bit */
506 /* shuffling on our part.  Reception works similarly.                  */
507
508 /* The feedback terms table consists of 256, 32-bit entries.  Notes:   */
509 /*                                                                     */
510 /*  1. The table can be generated at runtime if desired; code to do so */
511 /*     is shown later.  It might not be obvious, but the feedback      */
512 /*     terms simply represent the results of eight shift/xor opera-    */
513 /*     tions for all combinations of data and CRC register values.     */
514 /*                                                                     */
515 /*  2. The CRC accumulation logic is the same for all CRC polynomials, */
516 /*     be they sixteen or thirty-two bits wide.  You simply choose the */
517 /*     appropriate table.  Alternatively, because the table can be     */
518 /*     generated at runtime, you can start by generating the table for */
519 /*     the polynomial in question and use exactly the same "updcrc",   */
520 /*     if your application needn't simultaneously handle two CRC       */
521 /*     polynomials.  (Note, however, that XMODEM is strange.)          */
522 /*                                                                     */
523 /*  3. For 16-bit CRCs, the table entries need be only 16 bits wide;   */
524 /*     of course, 32-bit entries work OK if the high 16 bits are zero. */
525 /*                                                                     */
526 /*  4. The values must be right-shifted by eight bits by the "updcrc"  */
527 /*     logic; the shift must be unsigned (bring in zeroes).  On some   */
528 /*     hardware you could probably optimize the shift in assembler by  */
529 /*     using byte-swap instructions.                                   */
530
531
532 static DWORD calc_crc32(const unsigned char *buf, size_t len)
533 {
534 #define UPDC32(octet,crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
535     static const DWORD crc_32_tab[] =
536     { /* CRC polynomial 0xedb88320 */
537         0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
538         0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
539         0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
540         0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
541         0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
542         0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
543         0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
544         0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
545         0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
546         0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
547         0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
548         0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
549         0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
550         0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
551         0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
552         0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
553         0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
554         0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
555         0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
556         0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
557         0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
558         0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
559         0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
560         0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
561         0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
562         0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
563         0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
564         0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
565         0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
566         0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
567         0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
568         0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
569         0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
570         0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
571         0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
572         0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
573         0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
574         0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
575         0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
576         0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
577         0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
578         0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
579         0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
580     };
581     size_t i;
582     DWORD crc = ~0;
583     for(i = 0; i < len; i++)
584         crc = UPDC32(buf[i], crc);
585     return ~crc;
586 #undef UPDC32
587 }
588
589
590 /******************************************************************
591  *              elf_load_debug_info_from_file
592  *
593  * Loads the symbolic information from ELF module stored in 'file'
594  * the module has been loaded at 'load_offset' address, so symbols' address
595  * relocation is performed. crc optionally points to the CRC of the debug file
596  * to load.
597  * returns
598  *      0 if the file doesn't contain symbolic info (or this info cannot be
599  *      read or parsed)
600  *      1 on success
601  */
602 static BOOL elf_load_debug_info_from_file(
603     struct module* module, const char* file, struct pool* pool,
604     struct hash_table* ht_symtab, const DWORD *crc)
605 {
606     BOOL                ret = FALSE;
607     char*               addr = (char*)0xffffffff;
608     int                 fd = -1;
609     struct stat         statbuf;
610     const Elf32_Ehdr*   ehptr;
611     const Elf32_Shdr*   spnt;
612     const char*         shstrtab;
613     int                 i;
614     int                 symtab_sect, dynsym_sect, stab_sect, stabstr_sect, debug_sect, debuglink_sect;
615     struct thunk_area   thunks[] = 
616     {
617         {"__wine_spec_import_thunks",           THUNK_ORDINAL_NOTYPE, 0, 0},    /* inter DLL calls */
618         {"__wine_spec_delayed_import_loaders",  THUNK_ORDINAL_LOAD,   0, 0},    /* delayed inter DLL calls */
619         {"__wine_spec_delayed_import_thunks",   THUNK_ORDINAL_LOAD,   0, 0},    /* delayed inter DLL calls */
620         {"__wine_delay_load",                   THUNK_ORDINAL_LOAD,   0, 0},    /* delayed inter DLL calls */
621         {"__wine_spec_thunk_text_16",           -16,                  0, 0},    /* 16 => 32 thunks */
622         {"__wine_spec_thunk_data_16",           -16,                  0, 0},    /* 16 => 32 thunks */
623         {"__wine_spec_thunk_text_32",           -32,                  0, 0},    /* 32 => 16 thunks */
624         {"__wine_spec_thunk_data_32",           -32,                  0, 0},    /* 32 => 16 thunks */
625     };
626
627     if (module->type != DMT_ELF || !module->elf_info)
628     {
629         ERR("Bad elf module '%s'\n", module->module.LoadedImageName);
630         return FALSE;
631     }
632
633     TRACE("%s\n", file);
634     /* check that the file exists, and that the module hasn't been loaded yet */
635     if (stat(file, &statbuf) == -1) goto leave;
636     if (S_ISDIR(statbuf.st_mode)) goto leave;
637
638     /*
639      * Now open the file, so that we can mmap() it.
640      */
641     if ((fd = open(file, O_RDONLY)) == -1) goto leave;
642
643     /*
644      * Now mmap() the file.
645      */
646     addr = mmap(0, statbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
647     if (addr == (char*)0xffffffff) goto leave;
648
649     if (crc && (*crc != calc_crc32(addr, statbuf.st_size)))
650     {
651         ERR("Bad CRC for file %s\n", file);
652         /* we don't tolerate mis-matched files */
653         goto leave;
654     }
655
656     /*
657      * Next, we need to find a few of the internal ELF headers within
658      * this thing.  We need the main executable header, and the section
659      * table.
660      */
661     ehptr = (Elf32_Ehdr*)addr;
662     spnt = (Elf32_Shdr*)(addr + ehptr->e_shoff);
663     shstrtab = (addr + spnt[ehptr->e_shstrndx].sh_offset);
664
665     symtab_sect = dynsym_sect = stab_sect = stabstr_sect = debug_sect = debuglink_sect = -1;
666
667     for (i = 0; i < ehptr->e_shnum; i++)
668     {
669         if (strcmp(shstrtab + spnt[i].sh_name, ".stab") == 0)
670             stab_sect = i;
671         if (strcmp(shstrtab + spnt[i].sh_name, ".stabstr") == 0)
672             stabstr_sect = i;
673         if (strcmp(shstrtab + spnt[i].sh_name, ".debug_info") == 0)
674             debug_sect = i;
675         if (strcmp(shstrtab + spnt[i].sh_name, ".gnu_debuglink") == 0)
676             debuglink_sect = i;
677         if ((strcmp(shstrtab + spnt[i].sh_name, ".symtab") == 0) &&
678             (spnt[i].sh_type == SHT_SYMTAB))
679             symtab_sect = i;
680         if ((strcmp(shstrtab + spnt[i].sh_name, ".dynsym") == 0) &&
681             (spnt[i].sh_type == SHT_DYNSYM))
682             dynsym_sect = i;
683     }
684
685     if (symtab_sect == -1)
686     {
687         /* if we don't have a symtab but a dynsym, process the dynsym
688          * section instead. It'll contain less (relevant) information, 
689          * but it'll be better than nothing
690          */
691         if (dynsym_sect == -1) goto leave;
692         symtab_sect = dynsym_sect;
693     }
694
695     module->module.SymType = SymExport;
696
697     /* create a hash table for the symtab */
698     elf_hash_symtab(module, pool, ht_symtab, addr, 
699                     spnt + symtab_sect, spnt + spnt[symtab_sect].sh_link,
700                     sizeof(thunks) / sizeof(thunks[0]), thunks);
701
702     if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
703     {
704         if (stab_sect != -1 && stabstr_sect != -1)
705         {
706             /* OK, now just parse all of the stabs. */
707             ret = stabs_parse(module, module->elf_info->elf_addr,
708                               addr + spnt[stab_sect].sh_offset,
709                               spnt[stab_sect].sh_size,
710                               addr + spnt[stabstr_sect].sh_offset,
711                               spnt[stabstr_sect].sh_size);
712             if (!ret)
713             {
714                 WARN("Couldn't read correctly read stabs\n");
715                 goto leave;
716             }
717             /* and fill in the missing information for stabs */
718             elf_finish_stabs_info(module, ht_symtab);
719         }
720         else if (debug_sect != -1)
721         {
722             /* Dwarf 2 debug information */
723             FIXME("Unsupported Dwarf2 information for %s\n", module->module.ModuleName);
724         }
725         else if (debuglink_sect != -1)
726         {
727             DWORD crc;
728             const char * file = (const char *)(addr + spnt[debuglink_sect].sh_offset);
729             /* crc is stored after the null terminated file string rounded
730              * up to the next 4 byte boundary */
731             crc = *(const DWORD *)(file + ((DWORD_PTR)(strlen(file) + 4) & ~3));
732             ret = elf_load_debug_info_from_file(module, file, pool, ht_symtab, &crc);
733             if (!ret)
734                 WARN("Couldn't load linked debug file %s\n", file);
735         }
736     }
737     if (strstr(module->module.ModuleName, "<elf>") ||
738         !strcmp(module->module.ModuleName, "<wine-loader>"))
739     {
740         /* add the thunks for native libraries */
741         if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
742             elf_new_wine_thunks(module, ht_symtab, 
743                                 sizeof(thunks) / sizeof(thunks[0]), thunks);
744     }
745     /* add all the public symbols from symtab */
746     if (elf_new_public_symbols(module, ht_symtab) && !ret) ret = TRUE;
747
748 leave:
749     if (addr != (char*)0xffffffff) munmap(addr, statbuf.st_size);
750     if (fd != -1) close(fd);
751
752     return ret;
753 }
754
755 /******************************************************************
756  *              elf_load_debug_info
757  *
758  * Loads ELF debugging information from the module image file.
759  */
760 BOOL elf_load_debug_info(struct module* module)
761 {
762     BOOL              ret;
763     struct pool       pool;
764     struct hash_table ht_symtab;
765
766     pool_init(&pool, 65536);
767     hash_table_init(&pool, &ht_symtab, 256);
768
769     ret = elf_load_debug_info_from_file(module,
770         module->module.LoadedImageName, &pool, &ht_symtab, NULL);
771
772     pool_destroy(&pool);
773
774     return ret;
775 }
776
777
778 /******************************************************************
779  *              is_dt_flag_valid
780  * returns true iff the section tag is valid 
781  */
782 static unsigned is_dt_flag_valid(unsigned d_tag)
783 {
784 #ifndef DT_PROCNUM
785 #define DT_PROCNUM 0
786 #endif
787 #ifndef DT_EXTRANUM
788 #define DT_EXTRANUM 0
789 #endif
790     return (d_tag >= 0 && d_tag < DT_NUM + DT_PROCNUM + DT_EXTRANUM)
791 #if defined(DT_LOOS) && defined(DT_HIOS)
792         || (d_tag >= DT_LOOS && d_tag < DT_HIOS)
793 #endif
794 #if defined(DT_LOPROC) && defined(DT_HIPROC)
795         || (d_tag >= DT_LOPROC && d_tag < DT_HIPROC)
796 #endif
797         ;
798 }
799
800 /******************************************************************
801  *              elf_load_file
802  *
803  * Loads the information for ELF module stored in 'filename'
804  * the module has been loaded at 'load_offset' address
805  * returns
806  *      -1 if the file cannot be found/opened
807  *      0 if the file doesn't contain symbolic info (or this info cannot be
808  *      read or parsed)
809  *      1 on success
810  */
811 static BOOL elf_load_file(struct process* pcs, const char* filename,
812                           unsigned long load_offset, struct elf_info* elf_info)
813 {
814     static const BYTE   elf_signature[4] = { ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3 };
815     BOOL                ret = FALSE;
816     const char*         addr = (char*)0xffffffff;
817     int                 fd = -1;
818     struct stat         statbuf;
819     const Elf32_Ehdr*   ehptr;
820     const Elf32_Shdr*   spnt;
821     const Elf32_Phdr*   ppnt;
822     const char*         shstrtab;
823     int                 i;
824     DWORD               size, start;
825     unsigned            tmp, page_mask = getpagesize() - 1;
826
827     TRACE("Processing elf file '%s' at %08lx\n", filename, load_offset);
828
829     /* check that the file exists, and that the module hasn't been loaded yet */
830     if (stat(filename, &statbuf) == -1) goto leave;
831
832     /* Now open the file, so that we can mmap() it. */
833     if ((fd = open(filename, O_RDONLY)) == -1) goto leave;
834
835     /* Now mmap() the file. */
836     addr = mmap(0, statbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
837     if (addr == (char*)-1) goto leave;
838
839     /* Next, we need to find a few of the internal ELF headers within
840      * this thing.  We need the main executable header, and the section
841      * table.
842      */
843     ehptr = (const Elf32_Ehdr*)addr;
844     if (memcmp(ehptr->e_ident, elf_signature, sizeof(elf_signature))) goto leave;
845
846     spnt = (const Elf32_Shdr*)(addr + ehptr->e_shoff);
847     shstrtab = (addr + spnt[ehptr->e_shstrndx].sh_offset);
848
849     /* grab size of module once loaded in memory */
850     ppnt = (const Elf32_Phdr*)(addr + ehptr->e_phoff);
851     size = 0; start = ~0L;
852
853     for (i = 0; i < ehptr->e_phnum; i++)
854     {
855         if (ppnt[i].p_type == PT_LOAD)
856         {
857             tmp = (ppnt[i].p_vaddr + ppnt[i].p_memsz + page_mask) & ~page_mask;
858             if (size < tmp) size = tmp;
859             if (ppnt[i].p_vaddr < start) start = ppnt[i].p_vaddr;
860         }
861     }
862
863     /* if non relocatable ELF, then remove fixed address from computation
864      * otherwise, all addresses are zero based and start has no effect
865      */
866     size -= start;
867     if (!start && !load_offset)
868         ERR("Relocatable ELF %s, but no load address. Loading at 0x0000000\n",
869             filename);
870     if (start && load_offset)
871     {
872         WARN("Non-relocatable ELF %s, but load address of 0x%08lx supplied. "
873              "Assuming load address is corrupt\n", filename, load_offset);
874         load_offset = 0;
875     }
876
877     if (elf_info->flags & ELF_INFO_DEBUG_HEADER)
878     {
879         for (i = 0; i < ehptr->e_shnum; i++)
880         {
881             if (strcmp(shstrtab + spnt[i].sh_name, ".dynamic") == 0 &&
882                 spnt[i].sh_type == SHT_DYNAMIC)
883             {
884                 Elf32_Dyn       dyn;
885                 char*           ptr = (char*)spnt[i].sh_addr;
886                 unsigned long   len;
887
888                 do
889                 {
890                     if (!ReadProcessMemory(pcs->handle, ptr, &dyn, sizeof(dyn), &len) ||
891                         len != sizeof(dyn) || !is_dt_flag_valid(dyn.d_tag))
892                         dyn.d_tag = DT_NULL;
893                     ptr += sizeof(dyn);
894                 } while (dyn.d_tag != DT_DEBUG && dyn.d_tag != DT_NULL);
895                 if (dyn.d_tag == DT_NULL) goto leave;
896                 elf_info->dbg_hdr_addr = dyn.d_un.d_ptr;
897             }
898         }
899     }
900
901     if (elf_info->flags & ELF_INFO_MODULE)
902     {
903         struct elf_module_info *elf_module_info = 
904             HeapAlloc(GetProcessHeap(), 0, sizeof(struct elf_module_info));
905         if (!elf_module_info) goto leave;
906         elf_info->module = module_new(pcs, filename, DMT_ELF, 
907                                         (load_offset) ? load_offset : start, 
908                                         size, 0, 0);
909         if (!elf_info->module)
910         {
911             HeapFree(GetProcessHeap(), 0, elf_module_info);
912             goto leave;
913         }
914         elf_info->module->elf_info = elf_module_info;
915         elf_info->module->elf_info->elf_addr = load_offset;
916
917         if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
918         {
919             elf_info->module->module.SymType = SymDeferred;
920             ret = TRUE;
921         }
922         else ret = elf_load_debug_info(elf_info->module);
923
924         elf_info->module->elf_info->elf_mark = 1;
925         elf_info->module->elf_info->elf_loader = 0;
926     } else ret = TRUE;
927
928 leave:
929     if (addr != (char*)0xffffffff) munmap((void*)addr, statbuf.st_size);
930     if (fd != -1) close(fd);
931
932     return ret;
933 }
934
935 /******************************************************************
936  *              elf_load_file_from_path
937  * tries to load an ELF file from a set of paths (separated by ':')
938  */
939 static BOOL elf_load_file_from_path(HANDLE hProcess,
940                                     const char* filename,
941                                     unsigned long load_offset,
942                                     const char* path,
943                                     struct elf_info* elf_info)
944 {
945     BOOL                ret = FALSE;
946     char                *s, *t, *fn;
947     char*               paths = NULL;
948
949     if (!path) return FALSE;
950
951     paths = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(path) + 1), path);
952     for (s = paths; s && *s; s = (t) ? (t+1) : NULL) 
953     {
954         t = strchr(s, ':');
955         if (t) *t = '\0';
956         fn = HeapAlloc(GetProcessHeap(), 0, strlen(filename) + 1 + strlen(s) + 1);
957         if (!fn) break;
958         strcpy(fn, s);
959         strcat(fn, "/");
960         strcat(fn, filename);
961         ret = elf_load_file(hProcess, fn, load_offset, elf_info);
962         HeapFree(GetProcessHeap(), 0, fn);
963         if (ret) break;
964         s = (t) ? (t+1) : NULL;
965     }
966     
967     HeapFree(GetProcessHeap(), 0, paths);
968     return ret;
969 }
970
971 /******************************************************************
972  *              elf_search_and_load_file
973  *
974  * lookup a file in standard ELF locations, and if found, load it
975  */
976 static BOOL elf_search_and_load_file(struct process* pcs, const char* filename,
977                                      unsigned long load_offset, 
978                                      struct elf_info* elf_info)
979 {
980     BOOL                ret = FALSE;
981     struct module*      module;
982
983     if (filename == NULL || *filename == '\0') return FALSE;
984     if ((module = module_find_by_name(pcs, filename, DMT_ELF)))
985     {
986         elf_info->module = module;
987         module->elf_info->elf_mark = 1;
988         return module->module.SymType;
989     }
990
991     if (strstr(filename, "libstdc++")) return FALSE; /* We know we can't do it */
992     ret = elf_load_file(pcs, filename, load_offset, elf_info);
993     /* if relative pathname, try some absolute base dirs */
994     if (!ret && !strchr(filename, '/'))
995     {
996         ret = elf_load_file_from_path(pcs, filename, load_offset, 
997                                       getenv("PATH"), elf_info) ||
998             elf_load_file_from_path(pcs, filename, load_offset,
999                                     getenv("LD_LIBRARY_PATH"), elf_info) ||
1000             elf_load_file_from_path(pcs, filename, load_offset,
1001                                     getenv("WINEDLLPATH"), elf_info);
1002     }
1003     
1004     return ret;
1005 }
1006
1007 /******************************************************************
1008  *              elf_synchronize_module_list
1009  *
1010  * this functions rescans the debuggee module's list and synchronizes it with
1011  * the one from 'pcs', ie:
1012  * - if a module is in debuggee and not in pcs, it's loaded into pcs
1013  * - if a module is in pcs and not in debuggee, it's unloaded from pcs
1014  */
1015 BOOL    elf_synchronize_module_list(struct process* pcs)
1016 {
1017     struct r_debug      dbg_hdr;
1018     void*               lm_addr;
1019     struct link_map     lm;
1020     char                bufstr[256];
1021     struct elf_info     elf_info;
1022     struct module*      module;
1023
1024     if (!pcs->dbg_hdr_addr ||
1025         !ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr, 
1026                            &dbg_hdr, sizeof(dbg_hdr), NULL))
1027         return FALSE;
1028
1029     for (module = pcs->lmodules; module; module = module->next)
1030     {
1031         if (module->type == DMT_ELF) module->elf_info->elf_mark = 0;
1032     }
1033
1034     elf_info.flags = ELF_INFO_MODULE;
1035     /* Now walk the linked list.  In all known ELF implementations,
1036      * the dynamic loader maintains this linked list for us.  In some
1037      * cases the first entry doesn't appear with a name, in other cases it
1038      * does.
1039      */
1040     for (lm_addr = (void*)dbg_hdr.r_map; lm_addr; lm_addr = (void*)lm.l_next)
1041     {
1042         if (!ReadProcessMemory(pcs->handle, lm_addr, &lm, sizeof(lm), NULL))
1043             return FALSE;
1044
1045         if (lm.l_prev != NULL && /* skip first entry, normally debuggee itself */
1046             lm.l_name != NULL &&
1047             ReadProcessMemory(pcs->handle, lm.l_name, bufstr, sizeof(bufstr), NULL)) 
1048         {
1049             bufstr[sizeof(bufstr) - 1] = '\0';
1050             elf_search_and_load_file(pcs, bufstr, (unsigned long)lm.l_addr,
1051                                      &elf_info);
1052         }
1053     }
1054
1055     for (module = pcs->lmodules; module; module = module->next)
1056     {
1057         if (module->type == DMT_ELF && !module->elf_info->elf_mark && 
1058             !module->elf_info->elf_loader)
1059         {
1060             module_remove(pcs, module);
1061             /* restart all over */
1062             module = pcs->lmodules;
1063         }
1064     }
1065     return TRUE;
1066 }
1067
1068 /******************************************************************
1069  *              elf_read_wine_loader_dbg_info
1070  *
1071  * Try to find a decent wine executable which could have loaded the debuggee
1072  */
1073 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1074 {
1075     const char*         ptr;
1076     struct elf_info     elf_info;
1077     BOOL                ret;
1078
1079     elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_MODULE;
1080     /* All binaries are loaded with WINELOADER (if run from tree) or by the
1081      * main executable (either wine-kthread or wine-pthread)
1082      * Note: the heuristic use to know whether we need to load wine-pthread or
1083      * wine-kthread is not 100% safe
1084      */
1085     if ((ptr = getenv("WINELOADER")))
1086         ret = elf_search_and_load_file(pcs, ptr, 0, &elf_info);
1087     else 
1088     {
1089         ret = elf_search_and_load_file(pcs, "wine-kthread", 0, &elf_info) ||
1090             elf_search_and_load_file(pcs, "wine-pthread", 0, &elf_info);
1091     }
1092     if (!ret) return FALSE;
1093     elf_info.module->elf_info->elf_loader = 1;
1094     strcpy(elf_info.module->module.ModuleName, "<wine-loader>");
1095     return (pcs->dbg_hdr_addr = elf_info.dbg_hdr_addr) != 0;
1096 }
1097
1098 /******************************************************************
1099  *              elf_load_module
1100  *
1101  * loads an ELF module and stores it in process' module list
1102  * Also, find module real name and load address from
1103  * the real loaded modules list in pcs address space
1104  */
1105 struct module*  elf_load_module(struct process* pcs, const char* name)
1106 {
1107     struct elf_info     elf_info;
1108     BOOL                ret = FALSE;
1109     const char*         p;
1110     const char*         xname;
1111     struct r_debug      dbg_hdr;
1112     void*               lm_addr;
1113     struct link_map     lm;
1114     char                bufstr[256];
1115
1116     TRACE("(%p %s)\n", pcs, name);
1117
1118     elf_info.flags = ELF_INFO_MODULE;
1119
1120     /* do only the lookup from the filename, not the path (as we lookup module name
1121      * in the process' loaded module list)
1122      */
1123     xname = strrchr(name, '/');
1124     if (!xname++) xname = name;
1125
1126     if (!ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr, &dbg_hdr, sizeof(dbg_hdr), NULL))
1127         return NULL;
1128
1129     for (lm_addr = (void*)dbg_hdr.r_map; lm_addr; lm_addr = (void*)lm.l_next)
1130     {
1131         if (!ReadProcessMemory(pcs->handle, lm_addr, &lm, sizeof(lm), NULL))
1132             return NULL;
1133
1134         if (lm.l_prev != NULL && /* skip first entry, normally debuggee itself */
1135             lm.l_name != NULL &&
1136             ReadProcessMemory(pcs->handle, lm.l_name, bufstr, sizeof(bufstr), NULL)) 
1137         {
1138             bufstr[sizeof(bufstr) - 1] = '\0';
1139             /* memcmp is needed for matches when bufstr contains also version information
1140              * name: libc.so, bufstr: libc.so.6.0
1141              */
1142             p = strrchr(bufstr, '/');
1143             if (!p++) p = bufstr;
1144             if (!memcmp(p, xname, strlen(xname)))
1145             {
1146                 ret = elf_search_and_load_file(pcs, bufstr,
1147                                                (unsigned long)lm.l_addr, &elf_info);
1148                 break;
1149             }
1150         }
1151     }
1152     if (!lm_addr || !ret) return NULL;
1153     assert(elf_info.module);
1154     return elf_info.module;
1155 }
1156
1157 #else   /* !__ELF__ */
1158
1159 BOOL    elf_synchronize_module_list(struct process* pcs)
1160 {
1161     return FALSE;
1162 }
1163
1164 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1165 {
1166     return FALSE;
1167 }
1168
1169 struct module*  elf_load_module(struct process* pcs, const char* name)
1170 {
1171     return NULL;
1172 }
1173
1174 BOOL elf_load_debug_info(struct module* module)
1175 {
1176     return FALSE;
1177 }
1178 #endif  /* __ELF__ */