X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=buildtools%2Fpmdinfogen.py;h=7a739ec7d442889a2f8dc7763aea99344f68a1b5;hb=2192c428f9a6a92a8d8913fd9cf727ffa5810245;hp=474168f214af87dd06d784702b35b3cd59d86ed0;hpb=5031436f459e197da1fec087564026ec29d94227;p=dpdk.git diff --git a/buildtools/pmdinfogen.py b/buildtools/pmdinfogen.py index 474168f214..7a739ec7d4 100755 --- a/buildtools/pmdinfogen.py +++ b/buildtools/pmdinfogen.py @@ -10,6 +10,7 @@ import sys import tempfile try: + import elftools from elftools.elf.elffile import ELFFile from elftools.elf.sections import SymbolTableSection except ImportError: @@ -38,8 +39,13 @@ class ELFSymbol: 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") @@ -48,10 +54,20 @@ class ELFImage: 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): @@ -197,7 +213,9 @@ def dump_drivers(drivers, file): 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() @@ -231,15 +249,25 @@ def open_output(path): 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__":