]>
Commit | Line | Data |
---|---|---|
76a50749 | 1 | /* Return list of symbols the library can request. |
1c82b97f | 2 | Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. |
76a50749 UD |
3 | This file is part of the GNU C Library. |
4 | Contributed by Ulrich Drepper <drepper@redhat.com>, 2001. | |
5 | ||
6 | The GNU C Library is free software; you can redistribute it and/or | |
7 | modify it under the terms of the GNU Lesser General Public | |
8 | License as published by the Free Software Foundation; either | |
9 | version 2.1 of the License, or (at your option) any later version. | |
10 | ||
11 | The GNU C Library is distributed in the hope that it will be useful, | |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | Lesser General Public License for more details. | |
15 | ||
16 | You should have received a copy of the GNU Lesser General Public | |
17 | License along with the GNU C Library; if not, write to the Free | |
18 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | |
19 | 02111-1307 USA. */ | |
20 | ||
21 | #include <assert.h> | |
22 | #include <gnu/lib-names.h> | |
23 | #include "thread_dbP.h" | |
24 | ||
25 | ||
d43147cd RM |
26 | #ifdef HAVE_ASM_GLOBAL_DOT_NAME |
27 | # define DOT "." /* PPC64 requires . prefix on code symbols. */ | |
28 | #else | |
29 | # define DOT /* No prefix. */ | |
30 | #endif | |
31 | ||
76a50749 UD |
32 | static const char *symbol_list_arr[] = |
33 | { | |
7f08f55a RM |
34 | # define DB_STRUCT(type) \ |
35 | [SYM_SIZEOF_##type] = "_thread_db_sizeof_" #type, | |
36 | # define DB_STRUCT_FIELD(type, field) \ | |
37 | [SYM_##type##_FIELD_##field] = "_thread_db_" #type "_" #field, | |
38 | # define DB_SYMBOL(name) \ | |
39 | [SYM_##name] = #name, | |
d43147cd RM |
40 | # define DB_FUNCTION(name) \ |
41 | [SYM_##name] = DOT #name, | |
7f08f55a RM |
42 | # define DB_VARIABLE(name) \ |
43 | [SYM_##name] = #name, \ | |
44 | [SYM_DESC_##name] = "_thread_db_" #name, | |
45 | # include "structs.def" | |
46 | # undef DB_STRUCT | |
d43147cd | 47 | # undef DB_FUNCTION |
7f08f55a RM |
48 | # undef DB_SYMBOL |
49 | # undef DB_VARIABLE | |
50 | ||
51 | [SYM_TH_UNIQUE_CONST_THREAD_AREA] = "_thread_db_const_thread_area", | |
52 | [SYM_TH_UNIQUE_REGISTER64] = "_thread_db_register64", | |
53 | [SYM_TH_UNIQUE_REGISTER32] = "_thread_db_register32", | |
54 | [SYM_TH_UNIQUE_REGISTER32_THREAD_AREA] = "_thread_db_register32_thread_area", | |
55 | [SYM_TH_UNIQUE_REGISTER64_THREAD_AREA] = "_thread_db_register64_thread_area", | |
56 | ||
76a50749 UD |
57 | [SYM_NUM_MESSAGES] = NULL |
58 | }; | |
59 | ||
60 | ||
61 | const char ** | |
62 | td_symbol_list (void) | |
63 | { | |
64 | return symbol_list_arr; | |
65 | } | |
66 | ||
67 | ||
7f08f55a | 68 | ps_err_e |
76a50749 UD |
69 | td_lookup (struct ps_prochandle *ps, int idx, psaddr_t *sym_addr) |
70 | { | |
d43147cd | 71 | ps_err_e result; |
76a50749 | 72 | assert (idx >= 0 && idx < SYM_NUM_MESSAGES); |
d43147cd RM |
73 | result = ps_pglobal_lookup (ps, LIBPTHREAD_SO, symbol_list_arr[idx], |
74 | sym_addr); | |
75 | ||
76 | #ifdef HAVE_ASM_GLOBAL_DOT_NAME | |
77 | /* For PowerPC, 64-bit uses dot symbols but 32-bit does not. | |
78 | We could be a 64-bit libthread_db debugging a 32-bit libpthread. */ | |
79 | if (result == PS_NOSYM && symbol_list_arr[idx][0] == '.') | |
80 | result = ps_pglobal_lookup (ps, LIBPTHREAD_SO, &symbol_list_arr[idx][1], | |
81 | sym_addr); | |
82 | #endif | |
83 | ||
84 | return result; | |
76a50749 | 85 | } |