def cb_sym(self, symtype, *args): if symtype == addrxlat.SYM_VALUE: ms = gdb.lookup_minimal_symbol(args[0]) if ms is not None: return long(ms.value().address) elif symtype == addrxlat.SYM_SIZEOF: sym = gdb.lookup_symbol(args[0], None)[0] if sym is not None: return sym.type.sizeof elif symtype == addrxlat.SYM_OFFSETOF: sym = gdb.lookup_symbol(args[0], None, gdb.SYMBOL_STRUCT_DOMAIN)[0] if sym is None: # this works for typedefs: sym = gdb.lookup_symbol(args[0], None)[0] if sym is not None: return offsetof(sym.type, args[1]) return super(TranslationContext, self).cb_sym(symtype, *args)
def cb_sym(self, symtype, *args): if symtype == addrxlat.SYM_VALUE: ms = gdb.lookup_minimal_symbol(args[0]) if ms is not None: return long(ms.value().address) elif symtype == addrxlat.SYM_SIZEOF: sym = gdb.lookup_symbol(args[0], None)[0] if sym is not None: return sym.type.sizeof elif symtype == addrxlat.SYM_OFFSETOF: sym = gdb.lookup_symbol(args[0], None, gdb.SYMBOL_STRUCT_DOMAIN)[0] if sym is None: # this works for typedefs: sym = gdb.lookup_symbol(args[0], None)[0] if sym is not None: return offsetof(sym.type, args[1]) return super(TranslationContext, self).cb_sym(symtype, *args)
def cb_sym(self, symtype: int, *args: str) -> int: if symtype == addrxlat.SYM_VALUE: ms = gdb.lookup_minimal_symbol(args[0]) if ms is not None: return int(ms.value().address) elif symtype == addrxlat.SYM_SIZEOF: sym = gdb.lookup_symbol(args[0], None)[0] if sym is not None: return sym.type.sizeof elif symtype == addrxlat.SYM_OFFSETOF: sym = gdb.lookup_symbol(args[0], None, gdb.SYMBOL_STRUCT_DOMAIN)[0] if sym is None: # this works for typedefs: sym = gdb.lookup_symbol(args[0], None)[0] if sym is not None: ret = offsetof(sym.type, args[1], True) if ret is None: raise RuntimeError("offsetof can't return None with errors=True") return super().cb_sym(symtype, *args)
def test_ulong_by_symbol(self): t = gdb.lookup_global_symbol('global_ulong_symbol') with self.assertRaises(ArgumentTypeError): offset = offsetof(t, 'test_member')
def test_invalid_member(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'invalid_member')
def test_multi_level_lookup_invalid_first_component(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'test_member.next_component')
def test_invalid_python_type(self): with self.assertRaises(ArgumentTypeError): offset = offsetof(self, 'dontcare')
def test_embedded_struct_member2(self): offset = offsetof(self.test_struct, 'embedded_struct_member.embedded_member2') self.assertTrue(offset == 22 * self.ulongsize)
def test_anon_union_member1(self): offset = offsetof(self.test_struct, 'anon_union_member1') self.assertTrue(offset == 13 * self.ulongsize)
def test_anon_union_pointer_member2(self): offset = offsetof(self.test_struct.pointer(), 'anon_union_member2') self.assertTrue(offset == 13*self.ulongsize)
def test_anon_union_member1(self): offset = offsetof(self.test_struct, 'anon_union_member1') self.assertTrue(offset == 13*self.ulongsize)
def test_named_struct_pointer_member2(self): offset = offsetof(self.test_struct.pointer(), 'named_struct.named_struct_member2') self.assertTrue(offset == 8*self.ulongsize)
def test_named_struct_member1(self): offset = offsetof(self.test_struct, 'named_struct.named_struct_member1') self.assertTrue(offset == 7*self.ulongsize)
def test_named_struct(self): offset = offsetof(self.test_struct, 'named_struct') self.assertTrue(offset == 7*self.ulongsize)
def test_anon_struct_embedded_struct_list_prev(self): offset = offsetof(self.test_struct.pointer(), 'anon_struct_embedded_struct.embedded_list.prev') self.assertTrue(offset == 6*self.ulongsize)
def test_anon_struct_embedded_struct_list_prev(self): offset = offsetof(self.test_struct.pointer(), 'anon_struct_embedded_struct.embedded_list.prev') self.assertTrue(offset == 6 * self.ulongsize)
def test_named_struct_member1(self): offset = offsetof(self.test_struct, 'named_struct.named_struct_member1') self.assertTrue(offset == 7 * self.ulongsize)
def test_named_union_named_member2(self): offset = offsetof(self.test_struct, 'named_union.named_union_member2') self.assertTrue(offset == 17*self.ulongsize)
def test_named_union_named_member2(self): offset = offsetof(self.test_struct, 'named_union.named_union_member2') self.assertTrue(offset == 17 * self.ulongsize)
def test_named_union_anon_member2(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'named_union_member1')
def test_enum_lookup(self): offset = offsetof(self.test_struct, 'enum_member') self.assertTrue(offset == 26 * self.ulongsize)
def test_embedded_struct_member2(self): offset = offsetof(self.test_struct, 'embedded_struct_member.embedded_member2') self.assertTrue(offset == 22*self.ulongsize)
def test_multi_level_lookup_missing_first_component(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'missing.embedded_list.prev')
def test_embedded_struct_anon_member2(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'embedded_member2')
def test_multi_level_lookup_anon_union_missing_component(self): with self.assertRaises(InvalidComponentError): offset = offsetof( self.test_struct, 'anon_union_embedded_struct.invalid.next_component')
def test_enum_lookup(self): offset = offsetof(self.test_struct, 'enum_member') self.assertTrue(offset == 26*self.ulongsize)
def test_ulong_by_name(self): with self.assertRaises(ArgumentTypeError): offset = offsetof('unsigned long', 'test_member')
def test_enum_invalid_lookup(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'enum_member.invalid')
def test_union_by_value(self): t = gdb.lookup_global_symbol('global_union_symbol').value() with self.assertRaises(ArgumentTypeError): offset = offsetof(t, 'member1')
def test_multi_level_lookup_list_prev(self): offset = offsetof(self.test_struct, 'embedded_struct_member.embedded_list.prev') self.assertTrue(offset == 24*self.ulongsize)
def test_struct(self): offset = offsetof(self.test_struct, 'test_member') self.assertTrue(offset == 0)
def test_multi_level_lookup_missing_first_component(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'missing.embedded_list.prev')
def test_named_struct(self): offset = offsetof(self.test_struct, 'named_struct') self.assertTrue(offset == 7 * self.ulongsize)
def test_invalid_python_type(self): with self.assertRaises(InvalidArgumentError): offset = offsetof(self, 'dontcare')
def test_named_struct_pointer_member2(self): offset = offsetof(self.test_struct.pointer(), 'named_struct.named_struct_member2') self.assertTrue(offset == 8 * self.ulongsize)
def test_multi_level_lookup_missing_last_component(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'embedded_struct_member.embedded_list.invalid')
def test_anon_union_pointer_member2(self): offset = offsetof(self.test_struct.pointer(), 'anon_union_member2') self.assertTrue(offset == 13 * self.ulongsize)
def test_multi_level_lookup_invalid_first_component(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'test_member.next_component')
def test_named_union_anon_member2(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'named_union_member1')
def test_multi_level_lookup_invalid_middle_component(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'embedded_struct_member.embedded_member1.next_component')
def test_embedded_struct_anon_member2(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'embedded_member2')
def test_multi_level_lookup_anon_union_missing_component(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'anon_union_embedded_struct.invalid.next_component')
def test_enum_invalid_lookup(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'enum_member.invalid')
def test_type_by_string_name(self): offset = offsetof('struct test', 'test_member') self.assertTrue(offset == 0)
def test_multi_level_lookup_list_prev(self): offset = offsetof(self.test_struct, 'embedded_struct_member.embedded_list.prev') self.assertTrue(offset == 24 * self.ulongsize)
def test_type_by_invalid_name(self): with self.assertRaises(InvalidArgumentError): offset = offsetof('struct invalid_struct', 'test_member')
def test_multi_level_lookup_missing_last_component(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'embedded_struct_member.embedded_list.invalid')
def test_invalid_member(self): with self.assertRaises(InvalidComponentError): offset = offsetof(self.test_struct, 'invalid_member')
def test_multi_level_lookup_invalid_middle_component(self): with self.assertRaises(InvalidComponentError): offset = offsetof( self.test_struct, 'embedded_struct_member.embedded_member1.next_component')
def test_struct_by_value(self): val = gdb.lookup_global_symbol("global_struct_symbol").value() offset = offsetof(val, 'test_member') self.assertTrue(offset == 0)
def test_type_by_invalid_name(self): with self.assertRaises(ArgumentTypeError): offset = offsetof('struct invalid_struct', 'test_member')
def test_ulong_by_name(self): with self.assertRaises(InvalidArgumentTypeError): offset = offsetof('unsigned long', 'test_member')
def test_struct_by_value(self): val = gdb.lookup_global_symbol("global_struct_symbol").value() with self.assertRaises(ArgumentTypeError): offset = offsetof(val, 'test_member')
def test_ulong_by_type_pointer(self): t = gdb.lookup_type("unsigned long").pointer() with self.assertRaises(InvalidArgumentTypeError): offset = offsetof(t, 'test_member')
def test_ulong_by_type_pointer(self): t = gdb.lookup_type("unsigned long").pointer() with self.assertRaises(NotStructOrUnionError): offset = offsetof(t, 'test_member')
def test_ulong_by_symbol(self): t = gdb.lookup_global_symbol('global_ulong_symbol') with self.assertRaises(InvalidArgumentTypeError): offset = offsetof(t, 'test_member')
def test_void_pointer_by_value(self): t = gdb.lookup_global_symbol('global_void_pointer_symbol').value() with self.assertRaises(ArgumentTypeError): offset = offsetof(t, 'test_member')
def test_void_pointer_by_value(self): t = gdb.lookup_global_symbol('global_void_pointer_symbol').value() with self.assertRaises(InvalidArgumentTypeError): offset = offsetof(t, 'test_member')
def test_struct(self): offset = offsetof(self.test_struct, 'test_member') self.assertTrue(offset == 0)
def test_union_by_value(self): t = gdb.lookup_global_symbol('global_union_symbol').value() offset = offsetof(t, 'member1') self.assertTrue(offset == 0)