import tempfile
try:
+ import elftools
from elftools.elf.elffile import ELFFile
from elftools.elf.sections import SymbolTableSection
except ImportError:
def string_value(self):
size = self._symbol["st_size"]
value = self.get_value(0, size)
- return value[:-1].decode() if value else ""
+ return coff.decode_asciiz(value) # not COFF-specific
def get_value(self, offset, size):
section = self._symbol["st_shndx"]
class ELFImage:
def __init__(self, data):
+ version = tuple(int(c) for c in elftools.__version__.split("."))
+ self._legacy_elftools = version < (0, 24)
+
self._image = ELFFile(data)
- self._symtab = self._image.get_section_by_name(".symtab")
+
+ section = b".symtab" if self._legacy_elftools else ".symtab"
+ self._symtab = self._image.get_section_by_name(section)
if not isinstance(self._symtab, SymbolTableSection):
raise Exception(".symtab section is not a symbol table")
return not self._image.little_endian
def find_by_name(self, name):
- symbol = self._symtab.get_symbol_by_name(name)
+ symbol = self._get_symbol_by_name(name)
return ELFSymbol(self._image, symbol[0]) if symbol else None
+ def _get_symbol_by_name(self, name):
+ if not self._legacy_elftools:
+ return self._symtab.get_symbol_by_name(name)
+ name = name.encode("utf-8")
+ for symbol in self._symtab.iter_symbols():
+ if symbol.name == name:
+ return [symbol]
+ return None
+
def find_by_prefix(self, prefix):
+ prefix = prefix.encode("utf-8") if self._legacy_elftools else prefix
for i in range(self._symtab.num_symbols()):
symbol = self._symtab.get_symbol(i)
if symbol.name.startswith(prefix):
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument("format", help="object file format, 'elf' or 'coff'")
- parser.add_argument("input", help="input object file path or '-' for stdin")
+ parser.add_argument(
+ "input", nargs='+', help="input object file path or '-' for stdin"
+ )
parser.add_argument("output", help="output C file path or '-' for stdout")
return parser.parse_args()
return open(path, "w")
+def write_header(output):
+ output.write(
+ "static __attribute__((unused)) const char *generator = \"%s\";\n" % sys.argv[0]
+ )
+
+
def main():
args = parse_args()
+ if args.input.count('-') > 1:
+ raise Exception("'-' input cannot be used multiple times")
if args.format == "elf" and "ELFFile" not in globals():
raise Exception("elftools module not found")
- image = load_image(args.format, args.input)
- drivers = load_drivers(image)
output = open_output(args.output)
- dump_drivers(drivers, output)
+ write_header(output)
+ for path in args.input:
+ image = load_image(args.format, path)
+ drivers = load_drivers(image)
+ dump_drivers(drivers, output)
if __name__ == "__main__":