"""Schema for the JSON produced by llvm-readobj --elf-output-style=JSON."""
import typing
HoleKind: typing.TypeAlias = typing.Literal[
"ARM64_RELOC_BRANCH26",
"ARM64_RELOC_GOT_LOAD_PAGE21",
"ARM64_RELOC_GOT_LOAD_PAGEOFF12",
"ARM64_RELOC_PAGE21",
"ARM64_RELOC_PAGEOFF12",
"ARM64_RELOC_UNSIGNED",
"IMAGE_REL_AMD64_REL32",
"IMAGE_REL_ARM64_BRANCH26",
"IMAGE_REL_ARM64_PAGEBASE_REL21",
"IMAGE_REL_ARM64_PAGEOFFSET_12A",
"IMAGE_REL_ARM64_PAGEOFFSET_12L",
"IMAGE_REL_I386_DIR32",
"IMAGE_REL_I386_REL32",
"R_AARCH64_ABS64",
"R_AARCH64_ADR_GOT_PAGE",
"R_AARCH64_ADR_PREL_PG_HI21",
"R_AARCH64_CALL26",
"R_AARCH64_JUMP26",
"R_AARCH64_ADD_ABS_LO12_NC",
"R_AARCH64_LD64_GOT_LO12_NC",
"R_AARCH64_MOVW_UABS_G0_NC",
"R_AARCH64_MOVW_UABS_G1_NC",
"R_AARCH64_MOVW_UABS_G2_NC",
"R_AARCH64_MOVW_UABS_G3",
"R_X86_64_64",
"R_X86_64_GOTPCREL",
"R_X86_64_GOTPCRELX",
"R_X86_64_PC32",
"R_X86_64_REX_GOTPCRELX",
"X86_64_RELOC_BRANCH",
"X86_64_RELOC_GOT",
"X86_64_RELOC_GOT_LOAD",
"X86_64_RELOC_SIGNED",
"X86_64_RELOC_UNSIGNED",
]
class COFFRelocation(typing.TypedDict):
"""A COFF object file relocation record."""
Type: dict[typing.Literal["Value"], HoleKind]
Symbol: str
Offset: int
class ELFRelocation(typing.TypedDict):
"""An ELF object file relocation record."""
Addend: int
Offset: int
Symbol: dict[typing.Literal["Value"], str]
Type: dict[typing.Literal["Value"], HoleKind]
class MachORelocation(typing.TypedDict):
"""A Mach-O object file relocation record."""
Offset: int
Section: typing.NotRequired[dict[typing.Literal["Value"], str]]
Symbol: typing.NotRequired[dict[typing.Literal["Value"], str]]
Type: dict[typing.Literal["Value"], HoleKind]
class _COFFSymbol(typing.TypedDict):
Name: str
Value: int
class _ELFSymbol(typing.TypedDict):
Name: dict[typing.Literal["Name"], str]
Value: int
class _MachOSymbol(typing.TypedDict):
Name: dict[typing.Literal["Name"], str]
Value: int
class COFFSection(typing.TypedDict):
"""A COFF object file section."""
Characteristics: dict[
typing.Literal["Flags"], list[dict[typing.Literal["Name"], str]]
]
Number: int
RawDataSize: int
Relocations: list[dict[typing.Literal["Relocation"], COFFRelocation]]
SectionData: typing.NotRequired[dict[typing.Literal["Bytes"], list[int]]]
Symbols: list[dict[typing.Literal["Symbol"], _COFFSymbol]]
class ELFSection(typing.TypedDict):
"""An ELF object file section."""
Flags: dict[typing.Literal["Flags"], list[dict[typing.Literal["Name"], str]]]
Index: int
Info: int
Relocations: list[dict[typing.Literal["Relocation"], ELFRelocation]]
SectionData: dict[typing.Literal["Bytes"], list[int]]
Symbols: list[dict[typing.Literal["Symbol"], _ELFSymbol]]
Type: dict[typing.Literal["Name"], str]
class MachOSection(typing.TypedDict):
"""A Mach-O object file section."""
Address: int
Attributes: dict[typing.Literal["Flags"], list[dict[typing.Literal["Name"], str]]]
Index: int
Name: dict[typing.Literal["Value"], str]
Relocations: typing.NotRequired[
list[dict[typing.Literal["Relocation"], MachORelocation]]
]
SectionData: typing.NotRequired[dict[typing.Literal["Bytes"], list[int]]]
Symbols: typing.NotRequired[list[dict[typing.Literal["Symbol"], _MachOSymbol]]]