static bool objc_build_refs(RCoreObjc *objc) { ut64 off; ut8 *buf = calloc (1, objc->_const->vsize); if (!buf) { return false; } (void)r_io_read_at (objc->core->io, objc->_const->vaddr, buf, objc->_const->vsize); for (off = 0; off < objc->_const->vsize; off += objc->word_size) { ut64 va = objc->_const->vaddr + off; ut64 xrefs_to = r_read_le64 (buf + off); if (!xrefs_to) { continue; } sdb_array_add_num (objc->db, addr_key (va), xrefs_to, 0); } free (buf); buf = calloc (1, objc->_selrefs->vsize); if (!buf) { return false; } r_io_read_at (objc->core->io, objc->_selrefs->vaddr, buf, objc->_selrefs->vsize); for (off = 0; off < objc->_selrefs->vsize; off += objc->word_size) { ut64 va = objc->_selrefs->vaddr + off; ut64 xrefs_to = r_read_le64 (buf + off); if (!xrefs_to) { continue; } sdb_array_add_num (objc->db, addr_key (xrefs_to), va, 0); } free (buf); return true; }
static void headers64(RBinFile *bf) { #define p bf->rbin->cb_printf const ut8 *buf = r_buf_get_at (bf->buf, 0, NULL); p ("0x00000000 ELF64 0x%08x\n", r_read_le32 (buf)); p ("0x00000010 Type 0x%04x\n", r_read_le16 (buf + 0x10)); p ("0x00000012 Machine 0x%04x\n", r_read_le16 (buf + 0x12)); p ("0x00000014 Version 0x%08x\n", r_read_le32 (buf + 0x14)); p ("0x00000018 Entrypoint 0x%08"PFMT64x"\n", r_read_le64 (buf + 0x18)); p ("0x00000020 PhOff 0x%08"PFMT64x"\n", r_read_le64 (buf + 0x20)); p ("0x00000028 ShOff 0x%08"PFMT64x"\n", r_read_le64 (buf + 0x28)); }
R_API ut64 r_mem_get_num(const ut8 *b, int size) { // LITTLE ENDIAN is the default for streams switch (size) { case 1: return r_read_le8 (b); case 2: return r_read_le16 (b); case 4: return r_read_le32 (b); case 8: return r_read_le64 (b); } return 0LL; }
static ut64 readLE64(RBuffer *buf, int off) { int left = 0; const ut8 *data = r_buf_get_at (buf, off, &left); return left > 7? r_read_le64 (data): 0; }
static ut64 readQword (RCoreObjc *objc, ut64 addr) { ut8 buf[8]; (void)r_io_read_at (objc->core->io, addr, buf, sizeof (buf)); return r_read_le64 (buf); }