Skip to content

Commit

Permalink
Warn on unresolved symbols/relocs in ELF and better handle -1 address…
Browse files Browse the repository at this point in the history
…es ##bin
  • Loading branch information
trufae committed Jun 8, 2023
1 parent 044c2f7 commit 8028201
Show file tree
Hide file tree
Showing 16 changed files with 285 additions and 209 deletions.
11 changes: 8 additions & 3 deletions libr/bin/format/elf/elf.c
Original file line number Diff line number Diff line change
Expand Up @@ -1713,6 +1713,11 @@ static ut64 get_import_addr_ppc(ELFOBJ *eo, RBinElfReloc *rel) {
return UT64_MAX;
}

if (rel->rva < plt_addr) {
R_LOG_WARN ("reloc rva lower than plt_addr: 0x%"PFMT64x " < 0x%"PFMT64x, rel->rva, plt_addr);
return UT64_MAX;
}

ut64 p_plt_addr = Elf_(v2p_new) (eo, plt_addr);
if (p_plt_addr == UT64_MAX) {
return UT64_MAX;
Expand Down Expand Up @@ -3283,7 +3288,7 @@ static const RVector *load_sections_from_phdr(ELFOBJ *eo) {
num_sections++;
}
if (eo->dyn_info.dt_pltrelsz) {
pltgotsz = eo->dyn_info.dt_pltrelsz;
pltgotsz = eo->dyn_info.dt_pltrelsz; // XXX pltrel or pltgot?
}
if (eo->dyn_info.dt_jmprel != R_BIN_ELF_ADDR_MAX) {
relava = eo->dyn_info.dt_jmprel;
Expand Down Expand Up @@ -3939,7 +3944,7 @@ static bool _read_symbols_from_phdr (ELFOBJ *eo, ReadPhdrSymbolState *state) {
if (new_symbol->st_value) {
toffset = new_symbol->st_value;
} else if ((toffset = get_import_addr (eo, i)) == UT64_MAX) {
toffset = 0;
// toffset = 0;
}
tsize = 16;
} else if (type == R_BIN_ELF_ALL_SYMBOLS) {
Expand Down Expand Up @@ -4534,7 +4539,7 @@ static bool _process_symbols_and_imports_in_section(ELFOBJ *eo, int type, Proces
if (memory->sym[k].st_value) {
toffset = memory->sym[k].st_value;
} else if ((toffset = get_import_addr (eo, k)) == UT64_MAX) {
toffset = 0;
// toffset = 0;
}
tsize = 16;
is_imported = memory->sym[k].st_shndx == STN_UNDEF;
Expand Down
18 changes: 15 additions & 3 deletions libr/core/canal.c
Original file line number Diff line number Diff line change
Expand Up @@ -1499,7 +1499,7 @@ static int core_anal_graph_construct_edges(RCore *core, RAnalFunction *fcn, int
}
}
}
if (bbi->fail != -1) {
if (bbi->fail != UT64_MAX) {
nodes++;
if (is_html) {
r_cons_printf ("<div class=\"connector _0x%08"PFMT64x" _0x%08"PFMT64x"\">\n"
Expand Down Expand Up @@ -2238,6 +2238,9 @@ R_API void r_core_anal_datarefs(RCore *core, ut64 addr) {
RAnalRef *ref;
RList *refs = r_anal_function_get_refs (fcn);
r_list_foreach (refs, iter, ref) {
if (ref->addr == UT64_MAX) {
continue;
}
RBinObject *obj = r_bin_cur_object (core->bin);
RBinSection *binsec = r_bin_get_section_at (obj, ref->addr, true);
if (binsec && binsec->is_data) {
Expand Down Expand Up @@ -2267,6 +2270,9 @@ R_API void r_core_anal_coderefs(RCore *core, ut64 addr) {
RList *refs = r_anal_function_get_refs (fcn);
r_cons_printf ("agn %s\n", me);
r_list_foreach (refs, iter, ref) {
if (ref->addr == UT64_MAX) {
continue;
}
r_strf_buffer (32);
RFlagItem *item = r_flag_get_i (core->flags, ref->addr);
const char *dst = item? item->name: r_strf ("0x%08"PFMT64x, ref->addr);
Expand All @@ -2280,6 +2286,9 @@ R_API void r_core_anal_coderefs(RCore *core, ut64 addr) {
}

static void add_single_addr_xrefs(RCore *core, ut64 addr, RGraph *graph) {
if (addr == UT64_MAX) {
return;
}
r_return_if_fail (graph);
RFlagItem *f = r_flag_get_at (core->flags, addr, false);
char *me = (f && f->offset == addr)
Expand All @@ -2295,6 +2304,9 @@ static void add_single_addr_xrefs(RCore *core, ut64 addr, RGraph *graph) {
RAnalRef *ref;
RList *list = r_anal_xrefs_get (core->anal, addr);
r_list_foreach (list, iter, ref) {
if (ref->addr == UT64_MAX) {
continue;
}
RFlagItem *item = r_flag_get_i (core->flags, ref->addr);
char *src = item? r_str_new (item->name): r_str_newf ("0x%08" PFMT64x, ref->addr);
RGraphNode *reference_from = r_graph_add_node_info (graph, src, NULL, ref->addr);
Expand Down Expand Up @@ -3835,8 +3847,8 @@ R_API int r_core_anal_graph(RCore *core, ut64 addr, int opts) {
if (!is_html && !is_json && !is_keva) {
RAnalFunction *fcn = r_anal_get_fcn_in (core->anal, addr, 0);
if (is_star) {
char *name = get_title(fcn ? fcn->addr: addr);
r_cons_printf ("agn %s;", name);
char *name = get_title (fcn ? fcn->addr: addr);
r_cons_printf ("agn %s;", name);
} else {
r_cons_printf ("\t\"0x%08"PFMT64x"\";\n", fcn? fcn->addr: addr);
}
Expand Down
51 changes: 35 additions & 16 deletions libr/core/cbin.c
Original file line number Diff line number Diff line change
Expand Up @@ -1806,9 +1806,13 @@ static void set_bin_relocs(RelocInfo *ri, RBinReloc *reloc, ut64 addr, Sdb **db,
ut64 saddr = reloc->vaddr - ri->got_va;
int index = (saddr / 4) - 4;
ut64 naddr = r_bin_a2b (r->bin, ri->plt_va + (index * 12) + 0x20);
char *internal_reloc = r_str_newf ("rsym.%s", reloc_name);
(void)r_flag_set (r->flags, internal_reloc, naddr, bin_reloc_size (reloc));
free (internal_reloc);
if (naddr == UT64_MAX) {
R_LOG_WARN ("Cannot resolve reloc reference %s", reloc_name);
} else {
char *internal_reloc = r_str_newf ("rsym.%s", reloc_name);
(void)r_flag_set (r->flags, internal_reloc, naddr, bin_reloc_size (reloc));
free (internal_reloc);
}
}
}
}
Expand All @@ -1822,14 +1826,19 @@ static void set_bin_relocs(RelocInfo *ri, RBinReloc *reloc, ut64 addr, Sdb **db,
}
}
r_name_filter (flagname, 0);
RFlagItem *fi = r_flag_set (r->flags, flagname, addr, bin_reloc_size (reloc));
if (demname) {
char *realname = (r->bin->prefix)
? r_str_newf ("%s.reloc.%s", r->bin->prefix, demname)
: r_str_newf ("%s", demname);
r_flag_item_set_realname (fi, realname);
free (realname);
if (addr == UT64_MAX) {
R_LOG_WARN ("Cannot resolve reloc %s", demname);
} else {
RFlagItem *fi = r_flag_set (r->flags, flagname, addr, bin_reloc_size (reloc));
if (demname) {
char *realname = (r->bin->prefix)
? r_str_newf ("%s.reloc.%s", r->bin->prefix, demname)
: r_str_newf ("%s", demname);
r_flag_item_set_realname (fi, realname);
free (realname);
}
}

free (demname);
}

Expand Down Expand Up @@ -2018,6 +2027,11 @@ static int bin_relocs(RCore *r, PJ *pj, int mode, int va) {
free (relname);
}
} else if (IS_MODE_NORMAL (mode)) {
if (addr == UT64_MAX) {
R_LOG_WARN ("Cannot resolve address for %s", bin_reloc_type_name (reloc));
continue;
}

char *name = reloc->import
? strdup (reloc->import->name)
: reloc->symbol
Expand Down Expand Up @@ -2047,6 +2061,7 @@ static int bin_relocs(RCore *r, PJ *pj, int mode, int va) {
if (reloc->is_ifunc) {
r_strbuf_append (buf, " (ifunc)");
}

char *res = r_strbuf_drain (buf);
r_table_add_rowf (table, "XXss", addr, reloc->paddr,
bin_reloc_type_name (reloc), res);
Expand Down Expand Up @@ -2592,13 +2607,17 @@ static int bin_symbols(RCore *r, PJ *pj, int mode, ut64 laddr, int va, ut64 at,
char *fnp = (r->bin->prefix) ?
r_str_newf ("%s.%s", r->bin->prefix, fn):
strdup (r_str_get (fn));
RFlagItem *fi = r_flag_set (r->flags, fnp, addr, symbol->size);
if (fi) {
r_flag_item_set_realname (fi, n);
fi->demangled = (bool)(size_t)sn.demname;
if (addr == UT64_MAX) {
R_LOG_WARN ("Cannot resolve symbol address %s", n);
} else {
if (fn) {
R_LOG_WARN ("Can't find flag (%s)", fn);
RFlagItem *fi = r_flag_set (r->flags, fnp, addr, symbol->size);
if (fi) {
r_flag_item_set_realname (fi, n);
fi->demangled = (bool)(size_t)sn.demname;
} else {
if (fn) {
R_LOG_WARN ("Can't find flag (%s)", fn);
}
}
}
free (fnp);
Expand Down
4 changes: 2 additions & 2 deletions test/db/anal/bpf_64
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ nth paddr vaddr bind type size lib name demangled
-----------------------------------------------------------------------
3 0x00000c48 0x00000c48 GLOBAL FUNC 328 custom_panic
4 0x000009b8 0x000009b8 GLOBAL FUNC 328 entrypoint
1 ---------- 0x00000000 GLOBAL NOTYPE 16 imp.abort
2 ---------- 0x00000000 GLOBAL NOTYPE 16 imp.sol_log_
1 ---------- ---------- GLOBAL NOTYPE 16 imp.abort
2 ---------- ---------- GLOBAL NOTYPE 16 imp.sol_log_
EOF
RUN
Loading

0 comments on commit 8028201

Please sign in to comment.