1
Fork 0
This commit is contained in:
Jan-Erik Rediger 2023-12-09 00:12:50 +01:00
parent a4bf380c96
commit 3cbb3a1ce2

View file

@ -44,6 +44,7 @@ class CacheFlag(Flag):
INSTRUCTIONS = auto() INSTRUCTIONS = auto()
SECTIONS = auto() SECTIONS = auto()
EXPORTS = auto() EXPORTS = auto()
IMPORTS = auto()
SYMBOLS = auto() SYMBOLS = auto()
STRINGS = auto() STRINGS = auto()
VERSION_REQUIREMENTS = auto() VERSION_REQUIREMENTS = auto()
@ -124,6 +125,7 @@ def register_symbols(
cache_flags, cache_flags,
) )
def register_sections( def register_sections(
gob: goblin.Object, connection: apsw.Connection, cache_flags: CacheFlag gob: goblin.Object, connection: apsw.Connection, cache_flags: CacheFlag
) -> None: ) -> None:
@ -142,7 +144,17 @@ def register_sections(
} }
generator = Generator.make_generator( generator = Generator.make_generator(
["name", "segment", "addr", "size", "offset", "align", "reloff", "nreloc", "flags"], [
"name",
"segment",
"addr",
"size",
"offset",
"align",
"reloff",
"nreloc",
"flags",
],
dynamic_entries_generator, dynamic_entries_generator,
) )
@ -172,7 +184,16 @@ def register_exports(
} }
generator = Generator.make_generator( generator = Generator.make_generator(
["name", "size", "offset", "type", "address", "flags", "lib", "lib_symbol_name"], [
"name",
"size",
"offset",
"type",
"address",
"flags",
"lib",
"lib_symbol_name",
],
dynamic_entries_generator, dynamic_entries_generator,
) )
@ -185,10 +206,52 @@ def register_exports(
) )
def register_imports(
gob: goblin.Object, connection: apsw.Connection, cache_flags: CacheFlag
) -> None:
def dynamic_entries_generator() -> Iterator[dict[str, Any]]:
for imp in gob.imports():
yield {
"name": imp.name,
"dylib": imp.dylib,
"is_lazy": imp.is_lazy,
"offset": imp.offset,
"size": imp.size,
"address": imp.address,
"addend": imp.addend,
"is_weak": imp.is_weak,
"start_of_sequence_offset": imp.start_of_sequence_offset,
}
generator = Generator.make_generator(
[
"name",
"dylib",
"is_lazy",
"offset",
"size",
"address",
"addend",
"is_weak",
"start_of_sequence_offset",
],
dynamic_entries_generator,
)
register_generator(
connection,
generator,
"macho_imports",
CacheFlag.IMPORTS,
cache_flags,
)
g = goblin.Object("../mylib.dylib") g = goblin.Object("../mylib.dylib")
register_symbols(g, connection, CacheFlag.SYMBOLS) register_symbols(g, connection, CacheFlag.SYMBOLS)
register_sections(g, connection, CacheFlag.SECTIONS) register_sections(g, connection, CacheFlag.SECTIONS)
register_exports(g, connection, CacheFlag.EXPORTS) register_exports(g, connection, CacheFlag.EXPORTS)
register_imports(g, connection, CacheFlag.IMPORTS)
shell = apsw.shell.Shell(db=connection, stdin=sys.stdin) shell = apsw.shell.Shell(db=connection, stdin=sys.stdin)
shell.command_prompt(["ölf> "]) shell.command_prompt(["ölf> "])