Lines Matching defs:state

65 same_section (struct search_state *state,
70 return value == state->addr;
74 if (! state->adjust_st_value)
77 if (state->addr_shndx == SHN_UNDEF)
79 v = state->addr;
80 state->addr_shndx = __libdwfl_find_section_ndx (state->mod, &v);
84 return state->addr_shndx == __libdwfl_find_section_ndx (state->mod, &v);
88 if (state->addr_shndx == SHN_UNDEF || state->addr_symelf != symelf)
90 GElf_Addr mod_addr = dwfl_deadjust_st_value (state->mod, symelf,
91 state->addr);
93 state->addr_shndx = SHN_ABS;
94 state->addr_symelf = symelf;
103 state->addr_shndx = elf_ndxscn (scn);
109 return shndx == state->addr_shndx && state->addr_symelf == symelf;
131 try_sym_value (struct search_state *state,
139 if (value + sym->st_size > state->min_label)
140 state->min_label = value + sym->st_size;
142 if (sym->st_size == 0 || state->addr - value < sym->st_size)
146 if (state->closest_name == NULL
147 || state->closest_value < value
148 || binding_value (state->closest_sym) < binding_value (sym))
152 *state->closest_sym = *sym;
153 state->closest_value = value;
154 state->closest_shndx = shndx;
155 state->closest_elf = elf;
156 state->closest_name = name;
158 else if (state->closest_name == NULL
159 && value >= state->min_label
160 && same_section (state, value,
161 resolved ? state->mod->main.elf : elf,
168 state->sizeless_sym = *sym;
169 state->sizeless_value = value;
170 state->sizeless_shndx = shndx;
171 state->sizeless_elf = elf;
172 state->sizeless_name = name;
180 && state->closest_value == value
181 && ((state->closest_sym->st_size > sym->st_size
182 && (binding_value (state->closest_sym)
184 || (state->closest_sym->st_size >= sym->st_size
185 && (binding_value (state->closest_sym)
188 *state->closest_sym = *sym;
189 state->closest_value = value;
190 state->closest_shndx = shndx;
191 state->closest_elf = elf;
192 state->closest_name = name;
199 search_table (struct search_state *state, int start, int end)
208 const char *name = __libdwfl_getsym (state->mod, i, &sym, &value,
211 state->adjust_st_value);
214 && value <= state->addr
219 try_sym_value (state, value, &sym, name, shndx, elf, resolved);
223 if (resolved && state->mod->e_type != ET_REL)
226 adjusted_st_value = dwfl_adjusted_st_value (state->mod, elf,
229 && adjusted_st_value <= state->addr)
230 try_sym_value (state, adjusted_st_value, &sym, name, shndx,
252 struct search_state state =
281 int first_global = INTUSE (dwfl_module_getsymtab_first_global) (state.mod);
284 search_table (&state, first_global == 0 ? 1 : first_global, syments);
288 if (state.closest_name == NULL && first_global > 1
289 && (state.sizeless_name == NULL || state.sizeless_value != state.addr))
290 search_table (&state, 1, first_global);
294 if (state.closest_name == NULL
295 && state.sizeless_name != NULL
296 && state.sizeless_value >= state.min_label)
298 *state.closest_sym = state.sizeless_sym;
299 state.closest_value = state.sizeless_value;
300 state.closest_shndx = state.sizeless_shndx;
301 state.closest_elf = state.sizeless_elf;
302 state.closest_name = state.sizeless_name;
305 *off = state.addr - state.closest_value;
308 *shndxp = state.closest_shndx;
310 *elfp = state.closest_elf;
312 *biasp = dwfl_adjusted_st_value (state.mod, state.closest_elf, 0);
313 return state.closest_name;