Home | History | Annotate | Download | only in libdwfl

Lines Matching refs:state

61 same_section (struct search_state *state,
66 return value == state->addr;
70 if (! state->adjust_st_value)
73 if (state->addr_shndx == SHN_UNDEF)
75 v = state->addr;
76 state->addr_shndx = __libdwfl_find_section_ndx (state->mod, &v);
80 return state->addr_shndx == __libdwfl_find_section_ndx (state->mod, &v);
84 if (state->addr_shndx == SHN_UNDEF || state->addr_symelf != symelf)
86 GElf_Addr mod_addr = dwfl_deadjust_st_value (state->mod, symelf,
87 state->addr);
89 state->addr_shndx = SHN_ABS;
90 state->addr_symelf = symelf;
99 state->addr_shndx = elf_ndxscn (scn);
105 return shndx == state->addr_shndx && state->addr_symelf == symelf;
127 try_sym_value (struct search_state *state,
135 if (value + sym->st_size > state->min_label)
136 state->min_label = value + sym->st_size;
138 if (sym->st_size == 0 || state->addr - value < sym->st_size)
142 if (state->closest_name == NULL
143 || state->closest_value < value
144 || binding_value (state->closest_sym) < binding_value (sym))
148 *state->closest_sym = *sym;
149 state->closest_value = value;
150 state->closest_shndx = shndx;
151 state->closest_elf = elf;
152 state->closest_name = name;
154 else if (state->closest_name == NULL
155 && value >= state->min_label
156 && same_section (state, value,
157 resolved ? state->mod->main.elf : elf,
164 state->sizeless_sym = *sym;
165 state->sizeless_value = value;
166 state->sizeless_shndx = shndx;
167 state->sizeless_elf = elf;
168 state->sizeless_name = name;
176 && state->closest_value == value
177 && ((state->closest_sym->st_size > sym->st_size
178 && (binding_value (state->closest_sym)
180 || (state->closest_sym->st_size >= sym->st_size
181 && (binding_value (state->closest_sym)
184 *state->closest_sym = *sym;
185 state->closest_value = value;
186 state->closest_shndx = shndx;
187 state->closest_elf = elf;
188 state->closest_name = name;
195 search_table (struct search_state *state, int start, int end)
204 const char *name = __libdwfl_getsym (state->mod, i, &sym, &value,
207 state->adjust_st_value);
210 && value <= state->addr
215 try_sym_value (state, value, &sym, name, shndx, elf, resolved);
219 if (resolved && state->mod->e_type != ET_REL)
222 adjusted_st_value = dwfl_adjusted_st_value (state->mod, elf,
225 && adjusted_st_value <= state->addr)
226 try_sym_value (state, adjusted_st_value, &sym, name, shndx,
245 struct search_state state =
274 int first_global = INTUSE (dwfl_module_getsymtab_first_global) (state.mod);
277 search_table (&state, first_global == 0 ? 1 : first_global, syments);
281 if (state.closest_name == NULL && first_global > 1
282 && (state.sizeless_name == NULL || state.sizeless_value != state.addr))
283 search_table (&state, 1, first_global);
287 if (state.closest_name == NULL
288 && state.sizeless_name != NULL
289 && state.sizeless_value >= state.min_label)
291 *state.closest_sym = state.sizeless_sym;
292 state.closest_value = state.sizeless_value;
293 state.closest_shndx = state.sizeless_shndx;
294 state.closest_elf = state.sizeless_elf;
295 state.closest_name = state.sizeless_name;
298 *off = state.addr - state.closest_value;
301 *shndxp = state.closest_shndx;
303 *elfp = state.closest_elf;
305 *biasp = dwfl_adjusted_st_value (state.mod, state.closest_elf, 0);
306 return state.closest_name;