Lines Matching +full:data +full:- +full:path
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2016-2017 Mark Johnston <markj@FreeBSD.org>
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
117 (void)gelf_getsym(thunk->symtab->data, i1, &sym1); in symvalcmp()
118 (void)gelf_getsym(thunk->symtab->data, i2, &sym2); in symvalcmp()
121 return (sym1.st_value < sym2.st_value ? -1 : 1); in symvalcmp()
123 /* Prefer non-local symbols. */ in symvalcmp()
128 return (-1); in symvalcmp()
133 s1 = elf_strptr(thunk->e, thunk->symtab->stridx, sym1.st_name); in symvalcmp()
134 s2 = elf_strptr(thunk->e, thunk->symtab->stridx, sym2.st_name); in symvalcmp()
138 return (-1); in symvalcmp()
146 return (-1); in symvalcmp()
164 return (-1); in load_symtab()
173 return (-1); in load_symtab()
177 return (-1); in load_symtab()
179 if ((symtab->data = elf_getdata(scn, NULL)) == NULL) in load_symtab()
180 return (-1); in load_symtab()
182 symtab->index = calloc(nsyms, sizeof(u_int)); in load_symtab()
183 if (symtab->index == NULL) in load_symtab()
184 return (-1); in load_symtab()
186 symtab->index[i] = i; in load_symtab()
187 symtab->nsyms = nsyms; in load_symtab()
188 symtab->stridx = shdr.sh_link; in load_symtab()
192 qsort_r(symtab->index, nsyms, sizeof(u_int), symvalcmp, &thunk); in load_symtab()
201 file->symtab.nsyms = file->dynsymtab.nsyms = 0; in load_symtabs()
202 (void)load_symtab(file->elf, &file->symtab, SHT_SYMTAB); in load_symtabs()
203 (void)load_symtab(file->elf, &file->dynsymtab, SHT_DYNSYM); in load_symtabs()
207 open_debug_file(char *path, const char *debugfile, uint32_t crc) in open_debug_file() argument
213 fd = -1; in open_debug_file()
214 if ((n = strlcat(path, "/", PATH_MAX)) >= PATH_MAX) in open_debug_file()
216 if (strlcat(path, debugfile, PATH_MAX) >= PATH_MAX) in open_debug_file()
218 if ((fd = open(path, O_RDONLY | O_CLOEXEC)) < 0) in open_debug_file()
221 DPRINTFX("ERROR: CRC32 mismatch for %s", path); in open_debug_file()
223 fd = -1; in open_debug_file()
226 path[n] = '\0'; in open_debug_file()
238 char path[PATH_MAX]; in open_object() local
241 Elf_Data *data; in open_object() local
250 if (mapping->map.pr_mapname[0] == '\0') in open_object()
251 return (-1); /* anonymous object */ in open_object()
252 if (mapping->file->elf != NULL) in open_object()
255 file = mapping->file; in open_object()
256 map = &mapping->map; in open_object()
257 if ((fd = open(map->pr_mapname, O_RDONLY | O_CLOEXEC)) < 0) { in open_object()
258 DPRINTF("ERROR: open %s failed", map->pr_mapname); in open_object()
259 return (-1); in open_object()
262 DPRINTFX("ERROR: elf_begin() failed: %s", elf_errmsg(-1)); in open_object()
265 if (gelf_getehdr(e, &file->ehdr) != &file->ehdr) { in open_object()
266 DPRINTFX("ERROR: elf_getehdr() failed: %s", elf_errmsg(-1)); in open_object()
274 elf_errmsg(-1)); in open_object()
281 elf_errmsg(-1)); in open_object()
293 if ((data = elf_getdata(scn, NULL)) == NULL) { in open_object()
294 DPRINTFX("ERROR: elf_getdata failed: %s", elf_errmsg(-1)); in open_object()
299 * The data contains a null-terminated file name followed by a 4-byte in open_object()
302 if (data->d_size < sizeof(crc) + 1) { in open_object()
304 (ssize_t)data->d_size); in open_object()
307 if (strnlen(data->d_buf, data->d_size) >= data->d_size - sizeof(crc)) { in open_object()
308 DPRINTFX("ERROR: no null-terminator in gnu_debuglink section"); in open_object()
312 debugfile = data->d_buf; in open_object()
313 memcpy(&crc, (char *)data->d_buf + data->d_size - sizeof(crc), in open_object()
319 * - look in the directory containing the object, in open_object()
320 * - look in the subdirectory ".debug" of the directory containing the in open_object()
322 * - look in the global debug directories (currently /usr/lib/debug). in open_object()
324 (void)strlcpy(path, map->pr_mapname, sizeof(path)); in open_object()
325 (void)dirname(path); in open_object()
327 if ((fd2 = open_debug_file(path, debugfile, crc)) >= 0) in open_object()
330 if (strlcat(path, "/.debug", sizeof(path)) < sizeof(path) && in open_object()
331 (fd2 = open_debug_file(path, debugfile, crc)) >= 0) in open_object()
334 (void)snprintf(path, sizeof(path), PATH_DEBUG_DIR); in open_object()
335 if (strlcat(path, map->pr_mapname, sizeof(path)) < sizeof(path)) { in open_object()
336 (void)dirname(path); in open_object()
337 if ((fd2 = open_debug_file(path, debugfile, crc)) >= 0) in open_object()
343 file->elf = e; in open_object()
344 file->fd = fd; in open_object()
350 DPRINTFX("ERROR: elf_begin failed: %s", elf_errmsg(-1)); in open_object()
356 file->elf = e2; in open_object()
357 file->fd = fd2; in open_object()
365 return (-1); in open_object()
375 if (p->nmappings == 0) in proc_objname()
378 for (i = 0; i < p->nmappings; i++) { in proc_objname()
379 map = &p->mappings[i].map; in proc_objname()
380 if (addr >= map->pr_vaddr && in proc_objname()
381 addr < map->pr_vaddr + map->pr_size) { in proc_objname()
382 strlcpy(objname, map->pr_mapname, objnamesz); in proc_objname()
392 char last[MAXPATHLEN], path[MAXPATHLEN], *base; in proc_iter_objs() local
397 if (p->nmappings == 0) in proc_iter_objs()
399 return (-1); in proc_iter_objs()
403 for (i = 0; i < p->nmappings; i++) { in proc_iter_objs()
404 map = &p->mappings[i].map; in proc_iter_objs()
405 strlcpy(path, map->pr_mapname, sizeof(path)); in proc_iter_objs()
406 base = basename(path); in proc_iter_objs()
417 strlcpy(last, path, sizeof(last)); in proc_iter_objs()
428 if (p->nmappings == 0) in _proc_addr2map()
431 for (i = 0; i < p->nmappings; i++) { in _proc_addr2map()
432 mapping = &p->mappings[i]; in _proc_addr2map()
433 if (addr >= mapping->map.pr_vaddr && in _proc_addr2map()
434 addr < mapping->map.pr_vaddr + mapping->map.pr_size) in _proc_addr2map()
444 return (&_proc_addr2map(p, addr)->map); in proc_addr2map()
456 Elf_Data *data; in lookup_symbol_by_addr() local
460 if (symtab->nsyms == 0) in lookup_symbol_by_addr()
463 data = symtab->data; in lookup_symbol_by_addr()
465 max = symtab->nsyms - 1; in lookup_symbol_by_addr()
469 (void)gelf_getsym(data, symtab->index[mid], &sym); in lookup_symbol_by_addr()
474 max = mid - 1; in lookup_symbol_by_addr()
484 for (i = mid; i < symtab->nsyms; i++) { in lookup_symbol_by_addr()
485 (void)gelf_getsym(data, symtab->index[i], &sym); in lookup_symbol_by_addr()
489 (void)gelf_getsym(data, symtab->index[i - 1], symp); in lookup_symbol_by_addr()
490 s = elf_strptr(e, symtab->stridx, symp->st_name); in lookup_symbol_by_addr()
508 return (-1); in proc_addr2sym()
512 mapping->map.pr_mapname); in proc_addr2sym()
513 return (-1); in proc_addr2sym()
516 file = mapping->file; in proc_addr2sym()
517 off = file->ehdr.e_type == ET_DYN ? in proc_addr2sym()
518 mapping->map.pr_vaddr - mapping->map.pr_offset : 0; in proc_addr2sym()
521 addr -= off; in proc_addr2sym()
523 error = lookup_symbol_by_addr(file->elf, &file->dynsymtab, addr, &s, in proc_addr2sym()
526 error = lookup_symbol_by_addr(file->elf, &file->symtab, addr, in proc_addr2sym()
529 symcopy->st_value += off; in proc_addr2sym()
538 char path[MAXPATHLEN], *base; in _proc_name2map() local
544 if (p->nmappings == 0) in _proc_name2map()
547 for (i = 0; i < p->nmappings; i++) { in _proc_name2map()
548 mapping = &p->mappings[i]; in _proc_name2map()
549 (void)strlcpy(path, mapping->map.pr_mapname, sizeof(path)); in _proc_name2map()
550 base = basename(path); in _proc_name2map()
555 for (i = 0; i < p->nmappings; i++) { in _proc_name2map()
556 mapping = &p->mappings[i]; in _proc_name2map()
557 strlcpy(path, mapping->map.pr_mapname, sizeof(path)); in _proc_name2map()
558 base = basename(path); in _proc_name2map()
564 p->mappings[p->exec_map].map.pr_vaddr)); in _proc_name2map()
572 return (&_proc_name2map(p, name)->map); in proc_name2map()
583 Elf_Data *data; in lookup_symbol_by_name() local
587 if (symtab->nsyms == 0) in lookup_symbol_by_name()
589 data = symtab->data; in lookup_symbol_by_name()
590 for (i = 0; gelf_getsym(data, i, &sym) != NULL; i++) { in lookup_symbol_by_name()
591 s = elf_strptr(elf, symtab->stridx, sym.st_name); in lookup_symbol_by_name()
595 si->prs_id = i; in lookup_symbol_by_name()
613 return (-1); in proc_name2sym()
617 mapping->map.pr_mapname); in proc_name2sym()
618 return (-1); in proc_name2sym()
621 file = mapping->file; in proc_name2sym()
622 off = file->ehdr.e_type == ET_DYN ? in proc_name2sym()
623 mapping->map.pr_vaddr - mapping->map.pr_offset : 0; in proc_name2sym()
625 error = lookup_symbol_by_name(file->elf, &file->dynsymtab, symbol, in proc_name2sym()
628 error = lookup_symbol_by_name(file->elf, &file->symtab, symbol, in proc_name2sym()
631 symcopy->st_value += off; in proc_name2sym()
646 ctf = ctf_open(map->pr_mapname, &error); in proc_name2ctf()
668 return (-1); in proc_iter_symbyaddr()
672 mapping->map.pr_mapname); in proc_iter_symbyaddr()
673 return (-1); in proc_iter_symbyaddr()
676 file = mapping->file; in proc_iter_symbyaddr()
677 symtab = which == PR_SYMTAB ? &file->symtab : &file->dynsymtab; in proc_iter_symbyaddr()
678 if (symtab->nsyms == 0) in proc_iter_symbyaddr()
679 return (-1); in proc_iter_symbyaddr()
682 for (i = 0; gelf_getsym(symtab->data, i, &sym) != NULL; i++) { in proc_iter_symbyaddr()
707 s = elf_strptr(file->elf, symtab->stridx, sym.st_name); in proc_iter_symbyaddr()
708 if (file->ehdr.e_type == ET_DYN) in proc_iter_symbyaddr()
709 sym.st_value += mapping->map.pr_vaddr; in proc_iter_symbyaddr()