1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21: #include <assert.h>
22: #include <gnu/lib-names.h>
23: #include "thread_dbP.h"
24:
25:
26: #ifdef HAVE_ASM_GLOBAL_DOT_NAME
27: # define DOT "."
28: #else
29: # define DOT
30: #endif
31:
32: static const char *symbol_list_arr[] =
33: {
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,
40: # define DB_FUNCTION(name) \
41: [SYM_##name] = DOT #name,
42: # define DB_VARIABLE(name) \
43: [SYM_##name] = #name, \
44: [SYM_DESC_##name] = "_thread_db_" #name,
45: # include "structs.def"
46: # undef DB_STRUCT
47: # undef DB_FUNCTION
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:
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:
68: ps_err_e
69: td_lookup (struct ps_prochandle *ps, int idx, psaddr_t *sym_addr)
70: {
71: ps_err_e result;
72: assert (idx >= 0 && idx < SYM_NUM_MESSAGES);
73: result = ps_pglobal_lookup (ps, LIBPTHREAD_SO, symbol_list_arr[idx],
74: sym_addr);
75:
76: #ifdef HAVE_ASM_GLOBAL_DOT_NAME
77:
78:
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;
85: }