2 * File elf.c - processing of ELF files
4 * Copyright (C) 1996, Eric Youngdale.
5 * 1999-2004 Eric Pouech
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.
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.
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
29 #ifdef HAVE_SYS_MMAN_H
36 #define PATH_MAX MAX_PATH
39 #include "dbghelp_private.h"
41 #if defined(__svr4__) || defined(__sun)
48 #ifdef HAVE_SYS_ELF32_H
49 # include <sys/elf32.h>
51 #ifdef HAVE_SYS_EXEC_ELF_H
52 # include <sys/exec_elf.h>
55 # if defined(DT_COUNT)
56 # define DT_NUM DT_COUNT
58 /* this seems to be a satisfactory value on Solaris, which doesn't support this AFAICT */
65 #ifdef HAVE_SYS_LINK_H
66 # include <sys/link.h>
69 #include "wine/debug.h"
71 WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
73 struct elf_module_info
75 unsigned long elf_addr;
76 unsigned short elf_mark : 1,
82 #define ELF_INFO_DEBUG_HEADER 0x0001
83 #define ELF_INFO_MODULE 0x0002
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) */
94 struct hash_table_elt ht_elt;
95 const Elf32_Sym* symp;
103 THUNK_ORDINAL ordinal;
104 unsigned long rva_start;
105 unsigned long rva_end;
108 /******************************************************************
111 * creating an internal hash table to ease use ELF symtab information lookup
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)
121 const char* filename = NULL;
123 const Elf32_Sym* symp;
124 struct symtab_elt* ste;
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);
130 for (j = 0; j < num_areas; j++)
131 thunks[j].rva_start = thunks[j].rva_end = 0;
133 for (i = 0; i < nsym; i++, symp++)
135 /* Ignore certain types of entries which really aren't of that much
138 if (ELF32_ST_TYPE(symp->st_info) == STT_SECTION || symp->st_shndx == SHN_UNDEF)
143 symname = strp + symp->st_name;
145 if (ELF32_ST_TYPE(symp->st_info) == STT_FILE)
150 for (j = 0; j < num_areas; j++)
152 if (!strcmp(symname, thunks[j].symname))
154 thunks[j].rva_start = symp->st_value;
155 thunks[j].rva_end = symp->st_value + symp->st_size;
159 if (j < num_areas) continue;
161 /* FIXME: we don't need to handle them (GCC internals)
162 * Moreover, they screw up our symbol lookup :-/
164 if (symname[0] == '.' && symname[1] == 'L' && isdigit(symname[2]))
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)
175 ptr = symname + strlen(symname) - 1;
176 ste->ht_elt.name = symname;
179 while (*ptr >= '0' && *ptr <= '9' && ptr >= symname) ptr--;
180 if (ptr > symname && *ptr == '.')
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;
189 ste->filename = filename;
191 hash_table_add(ht_symtab, &ste->ht_elt);
195 /******************************************************************
198 * lookup a symbol by name in our internal hash table for the symtab
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)
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;
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.)
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;
223 else compiland_name = compiland_basename = NULL;
225 hash_table_iter_init(ht_symtab, &hti, name);
226 while ((ste = hash_table_iter_up(&hti)))
228 if (ste->used || strcmp(ste->ht_elt.name, name)) continue;
231 if ((ste->filename && !compiland_name) || (!ste->filename && compiland_name))
233 if (ste->filename && compiland_name)
235 if (strcmp(ste->filename, compiland_name))
237 base = strrchr(ste->filename, '/');
238 if (!base++) base = ste->filename;
239 if (strcmp(base, compiland_basename)) continue;
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);
254 if (!result && !(result = weak_result))
256 FIXME("Couldn't find symbol %s.%s in symtab\n",
257 module->module.ModuleName, name);
263 /******************************************************************
264 * elf_finish_stabs_info
266 * - get any relevant information (address & size) from the bits we got from the
267 * stabs debugging information
269 static void elf_finish_stabs_info(struct module* module, struct hash_table* symtab)
271 struct hash_table_iter hti;
274 const Elf32_Sym* symp;
276 hash_table_iter_init(&module->ht_symbols, &hti, NULL);
277 while ((ptr = hash_table_iter_up(&hti)))
279 sym = GET_ENTRY(ptr, struct symt_ht, hash_elt);
280 switch (sym->symt.tag)
283 if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
284 ((struct symt_function*)sym)->size)
288 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name,
289 ((struct symt_function*)sym)->container);
292 ((struct symt_function*)sym)->address = module->elf_info->elf_addr +
294 ((struct symt_function*)sym)->size = symp->st_size;
295 } else FIXME("Couldn't find %s\n", sym->hash_elt.name);
298 switch (((struct symt_data*)sym)->kind)
301 case DataIsFileStatic:
302 if (((struct symt_data*)sym)->u.address != module->elf_info->elf_addr)
304 symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name,
305 ((struct symt_data*)sym)->container);
308 ((struct symt_data*)sym)->u.address = module->elf_info->elf_addr +
310 ((struct symt_data*)sym)->kind = (ELF32_ST_BIND(symp->st_info) == STB_LOCAL) ?
311 DataIsFileStatic : DataIsGlobal;
318 FIXME("Unsupported tag %u\n", sym->symt.tag);
322 /* since we may have changed some addresses & sizes, mark the module to be resorted */
323 module->sortlist_valid = FALSE;
326 /******************************************************************
327 * elf_load_wine_thunks
329 * creating the thunk objects for a wine native DLL
331 static int elf_new_wine_thunks(struct module* module, struct hash_table* ht_symtab,
332 unsigned num_areas, struct thunk_area* thunks)
335 struct symt_compiland* compiland = NULL;
336 const char* compiland_name = NULL;
337 struct hash_table_iter hti;
338 struct symtab_elt* ste;
342 hash_table_iter_init(ht_symtab, &hti, NULL);
343 while ((ste = hash_table_iter_up(&hti)))
345 if (ste->used) continue;
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
353 if (!compiland_name || compiland_name != ste->filename)
354 compiland = symt_new_compiland(module,
355 compiland_name = ste->filename);
357 addr = module->elf_info->elf_addr + ste->symp->st_value;
359 for (j = 0; j < num_areas; j++)
361 if (ste->symp->st_value >= thunks[j].rva_start &&
362 ste->symp->st_value < thunks[j].rva_end)
365 if (j < num_areas) /* thunk found */
367 symt_new_thunk(module, compiland, ste->ht_elt.name, thunks[j].ordinal,
368 addr, ste->symp->st_size);
374 idx = symt_find_nearest(module, addr);
376 symt_get_info(&module->addr_sorttab[idx]->symt,
377 TI_GET_ADDRESS, &ref_addr);
378 if (idx == -1 || addr != ref_addr)
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
384 if (ELF32_ST_TYPE(ste->symp->st_info) == STT_FUNC)
386 symt_new_function(module, compiland, ste->ht_elt.name,
387 addr, ste->symp->st_size, NULL);
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);
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
402 module->sortlist_valid = TRUE;
404 else if (strcmp(ste->ht_elt.name, module->addr_sorttab[idx]->hash_elt.name))
407 DWORD xsize = 0, kind = -1;
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);
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
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);
430 /* see comment above */
431 module->sortlist_valid = FALSE;
435 /******************************************************************
436 * elf_new_public_symbols
438 * Creates a set of public symbols from an ELF symtab
440 static int elf_new_public_symbols(struct module* module, struct hash_table* symtab)
442 struct symt_compiland* compiland = NULL;
443 const char* compiland_name = NULL;
444 struct hash_table_iter hti;
445 struct symtab_elt* ste;
447 if (dbghelp_options & SYMOPT_NO_PUBLICS) return TRUE;
449 /* FIXME: we're missing the ELF entry point here */
451 hash_table_iter_init(symtab, &hti, NULL);
452 while ((ste = hash_table_iter_up(&hti)))
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
460 if (!compiland_name || compiland_name != ste->filename)
461 compiland = symt_new_compiland(module,
462 compiland_name = ste->filename);
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);
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
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 \**********************************************************************/
488 /* First, the polynomial itself and its table of feedback terms. The */
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. */
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. */
508 /* The feedback terms table consists of 256, 32-bit entries. Notes: */
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. */
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.) */
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. */
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. */
532 static DWORD calc_crc32(const unsigned char *buf, size_t len)
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
583 for(i = 0; i < len; i++)
584 crc = UPDC32(buf[i], crc);
590 /******************************************************************
591 * elf_load_debug_info_from_file
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
598 * 0 if the file doesn't contain symbolic info (or this info cannot be
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)
607 char* addr = (char*)0xffffffff;
610 const Elf32_Ehdr* ehptr;
611 const Elf32_Shdr* spnt;
612 const char* shstrtab;
614 int symtab_sect, dynsym_sect, stab_sect, stabstr_sect, debug_sect, debuglink_sect;
615 struct thunk_area thunks[] =
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 */
627 if (module->type != DMT_ELF || !module->elf_info)
629 ERR("Bad elf module '%s'\n", module->module.LoadedImageName);
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;
639 * Now open the file, so that we can mmap() it.
641 if ((fd = open(file, O_RDONLY)) == -1) goto leave;
644 * Now mmap() the file.
646 addr = mmap(0, statbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
647 if (addr == (char*)0xffffffff) goto leave;
649 if (crc && (*crc != calc_crc32(addr, statbuf.st_size)))
651 ERR("Bad CRC for file %s\n", file);
652 /* we don't tolerate mis-matched files */
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
661 ehptr = (Elf32_Ehdr*)addr;
662 spnt = (Elf32_Shdr*)(addr + ehptr->e_shoff);
663 shstrtab = (addr + spnt[ehptr->e_shstrndx].sh_offset);
665 symtab_sect = dynsym_sect = stab_sect = stabstr_sect = debug_sect = debuglink_sect = -1;
667 for (i = 0; i < ehptr->e_shnum; i++)
669 if (strcmp(shstrtab + spnt[i].sh_name, ".stab") == 0)
671 if (strcmp(shstrtab + spnt[i].sh_name, ".stabstr") == 0)
673 if (strcmp(shstrtab + spnt[i].sh_name, ".debug_info") == 0)
675 if (strcmp(shstrtab + spnt[i].sh_name, ".gnu_debuglink") == 0)
677 if ((strcmp(shstrtab + spnt[i].sh_name, ".symtab") == 0) &&
678 (spnt[i].sh_type == SHT_SYMTAB))
680 if ((strcmp(shstrtab + spnt[i].sh_name, ".dynsym") == 0) &&
681 (spnt[i].sh_type == SHT_DYNSYM))
685 if (symtab_sect == -1)
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
691 if (dynsym_sect == -1) goto leave;
692 symtab_sect = dynsym_sect;
695 module->module.SymType = SymExport;
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);
702 if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
704 if (stab_sect != -1 && stabstr_sect != -1)
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);
714 WARN("Couldn't read correctly read stabs\n");
717 /* and fill in the missing information for stabs */
718 elf_finish_stabs_info(module, ht_symtab);
720 else if (debug_sect != -1)
722 /* Dwarf 2 debug information */
723 FIXME("Unsupported Dwarf2 information for %s\n", module->module.ModuleName);
725 else if (debuglink_sect != -1)
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);
734 WARN("Couldn't load linked debug file %s\n", file);
737 if (strstr(module->module.ModuleName, "<elf>") ||
738 !strcmp(module->module.ModuleName, "<wine-loader>"))
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);
745 /* add all the public symbols from symtab */
746 if (elf_new_public_symbols(module, ht_symtab) && !ret) ret = TRUE;
749 if (addr != (char*)0xffffffff) munmap(addr, statbuf.st_size);
750 if (fd != -1) close(fd);
755 /******************************************************************
756 * elf_load_debug_info
758 * Loads ELF debugging information from the module image file.
760 BOOL elf_load_debug_info(struct module* module)
764 struct hash_table ht_symtab;
766 pool_init(&pool, 65536);
767 hash_table_init(&pool, &ht_symtab, 256);
769 ret = elf_load_debug_info_from_file(module,
770 module->module.LoadedImageName, &pool, &ht_symtab, NULL);
778 /******************************************************************
780 * returns true iff the section tag is valid
782 static unsigned is_dt_flag_valid(unsigned d_tag)
788 #define DT_EXTRANUM 0
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)
794 #if defined(DT_LOPROC) && defined(DT_HIPROC)
795 || (d_tag >= DT_LOPROC && d_tag < DT_HIPROC)
800 /******************************************************************
803 * Loads the information for ELF module stored in 'filename'
804 * the module has been loaded at 'load_offset' address
806 * -1 if the file cannot be found/opened
807 * 0 if the file doesn't contain symbolic info (or this info cannot be
811 static BOOL elf_load_file(struct process* pcs, const char* filename,
812 unsigned long load_offset, struct elf_info* elf_info)
814 static const BYTE elf_signature[4] = { ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3 };
816 const char* addr = (char*)0xffffffff;
819 const Elf32_Ehdr* ehptr;
820 const Elf32_Shdr* spnt;
821 const Elf32_Phdr* ppnt;
822 const char* shstrtab;
825 unsigned tmp, page_mask = getpagesize() - 1;
827 TRACE("Processing elf file '%s' at %08lx\n", filename, load_offset);
829 /* check that the file exists, and that the module hasn't been loaded yet */
830 if (stat(filename, &statbuf) == -1) goto leave;
832 /* Now open the file, so that we can mmap() it. */
833 if ((fd = open(filename, O_RDONLY)) == -1) goto leave;
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;
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
843 ehptr = (const Elf32_Ehdr*)addr;
844 if (memcmp(ehptr->e_ident, elf_signature, sizeof(elf_signature))) goto leave;
846 spnt = (const Elf32_Shdr*)(addr + ehptr->e_shoff);
847 shstrtab = (addr + spnt[ehptr->e_shstrndx].sh_offset);
849 /* grab size of module once loaded in memory */
850 ppnt = (const Elf32_Phdr*)(addr + ehptr->e_phoff);
851 size = 0; start = ~0L;
853 for (i = 0; i < ehptr->e_phnum; i++)
855 if (ppnt[i].p_type == PT_LOAD)
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;
863 /* if non relocatable ELF, then remove fixed address from computation
864 * otherwise, all addresses are zero based and start has no effect
867 if (!start && !load_offset)
868 ERR("Relocatable ELF %s, but no load address. Loading at 0x0000000\n",
870 if (start && load_offset)
872 WARN("Non-relocatable ELF %s, but load address of 0x%08lx supplied. "
873 "Assuming load address is corrupt\n", filename, load_offset);
877 if (elf_info->flags & ELF_INFO_DEBUG_HEADER)
879 for (i = 0; i < ehptr->e_shnum; i++)
881 if (strcmp(shstrtab + spnt[i].sh_name, ".dynamic") == 0 &&
882 spnt[i].sh_type == SHT_DYNAMIC)
885 char* ptr = (char*)spnt[i].sh_addr;
890 if (!ReadProcessMemory(pcs->handle, ptr, &dyn, sizeof(dyn), &len) ||
891 len != sizeof(dyn) || !is_dt_flag_valid(dyn.d_tag))
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;
901 if (elf_info->flags & ELF_INFO_MODULE)
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,
909 if (!elf_info->module)
911 HeapFree(GetProcessHeap(), 0, elf_module_info);
914 elf_info->module->elf_info = elf_module_info;
915 elf_info->module->elf_info->elf_addr = load_offset;
917 if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
919 elf_info->module->module.SymType = SymDeferred;
922 else ret = elf_load_debug_info(elf_info->module);
924 elf_info->module->elf_info->elf_mark = 1;
925 elf_info->module->elf_info->elf_loader = 0;
929 if (addr != (char*)0xffffffff) munmap((void*)addr, statbuf.st_size);
930 if (fd != -1) close(fd);
935 /******************************************************************
936 * elf_load_file_from_path
937 * tries to load an ELF file from a set of paths (separated by ':')
939 static BOOL elf_load_file_from_path(HANDLE hProcess,
940 const char* filename,
941 unsigned long load_offset,
943 struct elf_info* elf_info)
949 if (!path) return FALSE;
951 paths = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(path) + 1), path);
952 for (s = paths; s && *s; s = (t) ? (t+1) : NULL)
956 fn = HeapAlloc(GetProcessHeap(), 0, strlen(filename) + 1 + strlen(s) + 1);
960 strcat(fn, filename);
961 ret = elf_load_file(hProcess, fn, load_offset, elf_info);
962 HeapFree(GetProcessHeap(), 0, fn);
964 s = (t) ? (t+1) : NULL;
967 HeapFree(GetProcessHeap(), 0, paths);
971 /******************************************************************
972 * elf_search_and_load_file
974 * lookup a file in standard ELF locations, and if found, load it
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)
981 struct module* module;
983 if (filename == NULL || *filename == '\0') return FALSE;
984 if ((module = module_find_by_name(pcs, filename, DMT_ELF)))
986 elf_info->module = module;
987 module->elf_info->elf_mark = 1;
988 return module->module.SymType;
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, '/'))
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);
1007 /******************************************************************
1008 * elf_synchronize_module_list
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
1015 BOOL elf_synchronize_module_list(struct process* pcs)
1017 struct r_debug dbg_hdr;
1021 struct elf_info elf_info;
1022 struct module* module;
1024 if (!pcs->dbg_hdr_addr ||
1025 !ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr,
1026 &dbg_hdr, sizeof(dbg_hdr), NULL))
1029 for (module = pcs->lmodules; module; module = module->next)
1031 if (module->type == DMT_ELF) module->elf_info->elf_mark = 0;
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
1040 for (lm_addr = (void*)dbg_hdr.r_map; lm_addr; lm_addr = (void*)lm.l_next)
1042 if (!ReadProcessMemory(pcs->handle, lm_addr, &lm, sizeof(lm), NULL))
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))
1049 bufstr[sizeof(bufstr) - 1] = '\0';
1050 elf_search_and_load_file(pcs, bufstr, (unsigned long)lm.l_addr,
1055 for (module = pcs->lmodules; module; module = module->next)
1057 if (module->type == DMT_ELF && !module->elf_info->elf_mark &&
1058 !module->elf_info->elf_loader)
1060 module_remove(pcs, module);
1061 /* restart all over */
1062 module = pcs->lmodules;
1068 /******************************************************************
1069 * elf_read_wine_loader_dbg_info
1071 * Try to find a decent wine executable which could have loaded the debuggee
1073 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1076 struct elf_info elf_info;
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
1085 if ((ptr = getenv("WINELOADER")))
1086 ret = elf_search_and_load_file(pcs, ptr, 0, &elf_info);
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);
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;
1098 /******************************************************************
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
1105 struct module* elf_load_module(struct process* pcs, const char* name)
1107 struct elf_info elf_info;
1111 struct r_debug dbg_hdr;
1116 TRACE("(%p %s)\n", pcs, name);
1118 elf_info.flags = ELF_INFO_MODULE;
1120 /* do only the lookup from the filename, not the path (as we lookup module name
1121 * in the process' loaded module list)
1123 xname = strrchr(name, '/');
1124 if (!xname++) xname = name;
1126 if (!ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr, &dbg_hdr, sizeof(dbg_hdr), NULL))
1129 for (lm_addr = (void*)dbg_hdr.r_map; lm_addr; lm_addr = (void*)lm.l_next)
1131 if (!ReadProcessMemory(pcs->handle, lm_addr, &lm, sizeof(lm), NULL))
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))
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
1142 p = strrchr(bufstr, '/');
1143 if (!p++) p = bufstr;
1144 if (!memcmp(p, xname, strlen(xname)))
1146 ret = elf_search_and_load_file(pcs, bufstr,
1147 (unsigned long)lm.l_addr, &elf_info);
1152 if (!lm_addr || !ret) return NULL;
1153 assert(elf_info.module);
1154 return elf_info.module;
1157 #else /* !__ELF__ */
1159 BOOL elf_synchronize_module_list(struct process* pcs)
1164 BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
1169 struct module* elf_load_module(struct process* pcs, const char* name)
1174 BOOL elf_load_debug_info(struct module* module)
1178 #endif /* __ELF__ */