ATF_TC_BODY(symbol_lookup_fail, tc) { char symname[32]; GElf_Sym sym; struct proc_handle *phdl; prmap_t *map; int error; phdl = start_prog(tc, false); /* Initialize the rtld_db handle. */ (void)proc_rdagent(phdl); map = proc_name2map(phdl, target_prog_file); ATF_REQUIRE_MSG(map != NULL, "failed to look up map for '%s'", target_prog_file); /* * We shouldn't be able to find symbols at the beginning of a mapped * file. */ error = proc_addr2sym(phdl, map->pr_vaddr, symname, sizeof(symname), &sym); ATF_REQUIRE_MSG(error != 0, "unexpectedly found a symbol"); ATF_CHECK_EQ_MSG(proc_continue(phdl), 0, "failed to resume execution"); proc_free(phdl); }
/* * Wait for the specified process to hit a breakpoint at the specified symbol. */ static void verify_bkpt(struct proc_handle *phdl, GElf_Sym *sym, const char *symname, const char *mapname) { char mapbname[MAXPATHLEN], *name; GElf_Sym tsym; prmap_t *map; size_t namesz; u_long addr; int error, state; state = proc_wstatus(phdl); ATF_REQUIRE_EQ_MSG(state, PS_STOP, "process has state %d", state); /* Get the program counter and decrement it. */ error = proc_regget(phdl, REG_PC, &addr); ATF_REQUIRE_EQ_MSG(error, 0, "failed to obtain PC for '%s'", target_prog_file); proc_bkptregadj(&addr); /* * Make sure the PC matches the expected value obtained from the symbol * definition we looked up earlier. */ ATF_CHECK_EQ_MSG(addr, sym->st_value, "program counter 0x%lx doesn't match expected value 0x%jx", addr, (uintmax_t)sym->st_value); /* * Ensure we can look up the r_debug_state symbol using its starting * address and that the resulting symbol matches the one we found using * a name lookup. */ namesz = strlen(symname) + 1; name = malloc(namesz); ATF_REQUIRE(name != NULL); error = proc_addr2sym(phdl, addr, name, namesz, &tsym); ATF_REQUIRE_EQ_MSG(error, 0, "failed to look up symbol at 0x%lx", addr); ATF_REQUIRE_EQ(memcmp(sym, &tsym, sizeof(*sym)), 0); ATF_REQUIRE_EQ_MSG(strcmp(symname, name), 0, "expected symbol name '%s' doesn't match '%s'", symname, name); free(name); map = proc_addr2map(phdl, addr); ATF_REQUIRE_MSG(map != NULL, "failed to look up map for address 0x%lx", addr); basename_r(map->pr_mapname, mapbname); ATF_REQUIRE_EQ_MSG(strcmp(mapname, mapbname), 0, "expected map name '%s' doesn't match '%s'", mapname, mapbname); }
ATF_TC_BODY(symbol_sort_underscore, tc) { char symname[32]; GElf_Sym foo_sym; struct proc_handle *phdl; int error; phdl = start_prog(tc, true); error = proc_name2sym(phdl, target_prog_file, "foo", &foo_sym, NULL); ATF_REQUIRE_MSG(error == 0, "failed to look up 'foo' in %s", target_prog_file); error = proc_addr2sym(phdl, foo_sym.st_value, symname, sizeof(symname), &foo_sym); ATF_REQUIRE_MSG(error == 0, "failed to resolve 'foo' by addr"); ATF_REQUIRE_MSG(strcmp(symname, "foo") == 0, "unexpected symbol name '%s'", symname); }
ATF_TC_BODY(symbol_sort_local, tc) { char symname[32]; GElf_Sym bar_sym; struct proc_handle *phdl; int error; phdl = start_prog(tc, true); error = proc_name2sym(phdl, target_prog_file, "bar", &bar_sym, NULL); ATF_REQUIRE_MSG(error == 0, "failed to look up 'bar' in %s", target_prog_file); ATF_REQUIRE(GELF_ST_BIND(bar_sym.st_info) == STB_LOCAL); error = proc_addr2sym(phdl, bar_sym.st_value, symname, sizeof(symname), &bar_sym); ATF_REQUIRE_MSG(error == 0, "failed to resolve 'bar' by addr"); ATF_REQUIRE_MSG(strcmp(symname, "baz") == 0, "unexpected symbol name '%s'", symname); ATF_REQUIRE(GELF_ST_BIND(bar_sym.st_info) == STB_GLOBAL); }