Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add dwarf support for const and volatile types #519

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 31 additions & 6 deletions cle/backends/elf/variable_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ def read_from_die(die: DIE, elf_object):
return TypedefType.read_from_die(die, elf_object)
elif die.tag == "DW_TAG_union_type":
return UnionType.read_from_die(die, elf_object)
elif die.tag == "DW_TAG_const_type":
return ConstType.read_from_die(die, elf_object)
elif die.tag == "DW_TAG_volatile_type":
return VolatileType.read_from_die(die, elf_object)
return None

@staticmethod
Expand All @@ -49,6 +53,8 @@ def supported_die(die: DIE) -> bool:
"DW_TAG_array_type",
"DW_TAG_typedef",
"DW_TAG_union_type",
"DW_TAG_const_type",
"DW_TAG_volatile_type",
)


Expand All @@ -71,18 +77,15 @@ def read_from_die(cls, die: DIE, elf_object):
read an entry of DW_TAG_pointer_type. return None when there is no
byte_size or type attribute.
"""
byte_size = die.attributes.get("DW_AT_byte_size", None)

if byte_size is None:
return None

# some binaries may not have a "DW_AT_byte_size" for pointer type
byte_size = elf_object.arch.bytes
dw_at_type = die.attributes.get("DW_AT_type", None)
if dw_at_type is None:
referenced_offset = None
else:
referenced_offset = dw_at_type.value + die.cu.cu_offset

return cls(byte_size.value, elf_object, referenced_offset)
return cls(byte_size, elf_object, referenced_offset)

@property
def referenced_type(self):
Expand Down Expand Up @@ -164,6 +167,28 @@ class UnionType(StructType):
"""


class ConstType(VariableType):

def __init__(self, name, byte_size: int, elf_object):
super().__init__(name, byte_size, elf_object)

@classmethod
def read_from_die(cls, die: DIE, elf_object):
dw_at_type = die.attributes.get("DW_AT_type", None)
if dw_at_type is None:
return None
refer_offset = dw_at_type.value + die.cu.cu_offset
_next_level_die = die.cu.dwarfinfo.get_DIE_from_refaddr(refer_offset)
# NOTE: we return the type being referred to
return VariableType.read_from_die(_next_level_die, elf_object)


class VolatileType(ConstType):
"""
Entry class DW_TAG_volatile_type
"""


class StructMember:
"""
Entry class for DW_TAG_member. This is not a type but a named member inside a struct.
Expand Down
Loading