示例#1
0
    def generateSimilarSymbolsTableHTML(self):

        table_html = ""

        index = 0
        for symbol_pair in self.binary_pair.similar_symbols:

            index = index + 1

            old_symbol = symbol_pair[0]
            new_symbol = symbol_pair[1]

            old_symbol_name_html = html.escapeString(old_symbol.name)
            new_symbol_name_html = html.escapeString(new_symbol.name)

            table_html += "<tr><td>%s</td><td><p>%s</p><p>%s</p></td><td><p>%s</p><p>%s</p></td><td><p>%s</p><p>%s</p></td><td>%s</td></tr>\n" % ( \
                                 html.generateSimilarSymbolTableEntry(str(index)), \
                                 html.generateSymbolTableEntryLight(old_symbol_name_html), \
                                 html.generateSymbolTableEntryLight(new_symbol_name_html), \
                                 old_symbol.type, \
                                 new_symbol.type, \
                                 html.formatNumber(old_symbol.size), \
                                 html.formatNumber(new_symbol.size), \
                                 html.formatNumberDelta(old_symbol.size, new_symbol.size))

        if len(self.binary_pair.similar_symbols) == 0:
            table_visible = "invisible"
        else:
            table_visible = True

        return [
            table_html, table_visible,
            len(self.binary_pair.similar_symbols)
        ]
示例#2
0
 def generateSimilarSymbolDetailsHTML(self):
    
    html_lines = []
    
    index = 0;
    for symbol_pair in self.binary_pair.similar_symbols:
       
       index = index + 1
       
       old_symbol = symbol_pair[0]
       new_symbol = symbol_pair[1]
       
       old_symbol_name_html = html.escapeString(old_symbol.name)
       new_symbol_name_html = html.escapeString(new_symbol.name)
          
       symbol_differences = old_symbol.getDifferencesAsHTML(new_symbol, "   ")
       
       if old_symbol.size == new_symbol.size:
          size_info = "size unchanged"
       else:
          size_info = formatMemChange("", old_symbol.size, new_symbol.size)
          
       html_lines.append("<%s>Similar pair %s (%s)</%s>\n" % ( \
                                        self.settings.symbols_html_header, \
                                        html.generateSimilarSymbolDetailsTitle(str(index)), \
                                        size_info, \
                                        self.settings.symbols_html_header))
       html_lines.append("<p>Old: %s</p>\n" % (html.generateSymbolDetailsTitle(old_symbol_name_html)))
       html_lines.append("<p>New: %s</p>\n" % (html.generateSymbolDetailsTitle(new_symbol_name_html)))
       html_lines.append("%s\n" % (symbol_differences))
          
    return "\n".join(html_lines)
示例#3
0
    def generatePersistentSymbolDetailsHTML(self):

        old_binary = self.binary_pair.old_binary
        new_binary = self.binary_pair.new_binary

        html_lines = []

        for symbol_name in self.binary_pair.persisting_symbol_names:

            old_symbol = old_binary.symbols[symbol_name]
            new_symbol = new_binary.symbols[symbol_name]

            symbol_name_html = html.escapeString(symbol_name)

            if not old_symbol.__eq__(new_symbol):

                symbol_differences = old_symbol.getDifferencesAsHTML(
                    new_symbol, "   ")

                if old_symbol.size == new_symbol.size:
                    size_info = "size unchanged"
                else:
                    size_info = formatMemChange("", old_symbol.size,
                                                new_symbol.size)

                html_lines.append("<{header}>{title} ({size_info})</{header}>\n".format( \
                                  header = self.settings.symbols_html_header, \
                                  title = html.generateSymbolDetailsTitle(symbol_name_html), \
                                  size_info = size_info))
                html_lines.append("%s\n" % (symbol_differences))

        return "\n".join(html_lines)
示例#4
0
    def generateNewSymbolsTableHTML(self):

        new_binary = self.binary_pair.new_binary

        table_html = ""
        overal_symbol_size = 0

        for symbol_name in sorted(self.binary_pair.new_symbol_names, \
                                  key=lambda symbol_name: new_binary.symbols[symbol_name].size, \
                                  reverse = True):
            symbol_name_html = html.escapeString(symbol_name)
            symbol = new_binary.symbols[symbol_name]
            table_html += "<tr><td>%s</td><td>%s</td><td>%s</td></tr>\n" % ( \
                                 html.generateSymbolTableEntry(symbol_name_html), \
                                 symbol.type, \
                                 html.formatNumber(symbol.size))

            if symbol.livesInProgramMemory():
                overal_symbol_size += symbol.size

        if len(self.binary_pair.new_symbol_names) == 0:
            table_visible = "invisible"
        else:
            table_visible = True

        return [
            table_html, table_visible,
            html.highlightNumber(overal_symbol_size)
        ]
示例#5
0
 def generateNewSymbolDetailsHTML(self):
    
    html_lines = []
    
    if len(self.binary_pair.new_symbol_names) > 0:
       html_lines.append("<pre>")
       for symbol_name in self.binary_pair.new_symbol_names:
          symbol = self.binary_pair.new_binary.symbols[symbol_name]
          symbol_name_html = html.escapeString(symbol_name)
          html_lines.append("<%s>%s: %d bytes</%s>\n" % ( \
                                               self.settings.symbols_html_header, \
                                               html.generateSymbolDetailsTitle(symbol_name_html), \
                                               symbol.size, \
                                               self.settings.symbols_html_header))
          html_lines.append(html.escapeString(symbol.getInstructionsBlock("   ") + "\n"))
       html_lines.append("</pre>")
          
    return "\n".join(html_lines)
示例#6
0
    def generatePersistingSymbolsTableHTML(self):

        old_binary = self.binary_pair.old_binary
        new_binary = self.binary_pair.new_binary

        table_html = ""

        import operator

        diff_by_symbol = {}
        for symbol_name in self.binary_pair.persisting_symbol_names:
            old_symbol = old_binary.symbols[symbol_name]
            new_symbol = new_binary.symbols[symbol_name]

            difference = new_symbol.size - old_symbol.size

            diff_by_symbol[symbol_name] = difference

        sorted_by_diff = sorted(diff_by_symbol.items(),
                                key=operator.itemgetter(1),
                                reverse=True)

        size_delta = 0

        changed_symbols = []

        for symbol_tuple in sorted_by_diff:

            symbol_name = symbol_tuple[0]

            old_symbol = old_binary.symbols[symbol_name]
            new_symbol = new_binary.symbols[symbol_name]

            if new_symbol.livesInProgramMemory():
                size_delta += new_symbol.size - old_symbol.size

            if old_symbol.size != new_symbol.size:
                symbol_name_html = html.escapeString(symbol_name)
                changed_symbols.append(symbol_name)
                table_html += "<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n" % ( \
                                  html.generateSymbolTableEntry(symbol_name_html), \
                                  new_symbol.type, \
                                  html.formatNumber(old_symbol.size), \
                                  html.formatNumber(new_symbol.size), \
                                  html.formatNumberDelta(old_symbol.size, new_symbol.size))

        if size_delta == 0:
            table_visible = False
        else:
            table_visible = True

        return [
            table_html, table_visible,
            html.highlightNumber(size_delta), changed_symbols
        ]
示例#7
0
 def configureJinjaKeywords(self, skip_details):
          
    import datetime
    
    resource_consumtption_table = self.generateResourceConsumptionTableHTML()
    symbols_table = self.generateSymbolsTableHTML()
       
    if self.settings.project_title:
       doc_title = html.escapeString(self.settings.project_title)
    else:
       doc_title = "ELF Binary Comparison - Mass Report"
       
    return { \
        "elf_diff_repo_base" : self.settings.repo_path
       ,"doc_title" : doc_title
       ,"page_title" : u"ELF Binary Comparison - (c) 2019 by noseglasses" \
       ,"resource_consumption_table" : resource_consumtption_table \
       ,"symbols_table" : symbols_table \
       ,"date" : datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    }
示例#8
0
    def configureJinjaKeywords(self, skip_details):

        import datetime

        old_binary = self.binary_pair.old_binary
        new_binary = self.binary_pair.new_binary

        # If we generate a pdf files, we skip the details
        #
        if skip_details:
            details_visibility = False
            persisting_symbol_details_html = ""
            disappeared_symbol_details_html = ""
            new_symbol_details_html = ""
            similar_symbol_details_html = ""
        else:
            details_visibility = True
            persisting_symbol_details_html = self.generatePersistentSymbolDetailsHTML(
            )
            disappeared_symbol_details_html = self.generateDisappearedSymbolDetailsHTML(
            )
            new_symbol_details_html = self.generateNewSymbolDetailsHTML()
            similar_symbol_details_html = self.generateSimilarSymbolDetailsHTML(
            )

        if self.settings.project_title:
            doc_title = html.escapeString(self.settings.project_title)
        else:
            doc_title = "ELF Binary Comparison"

        [
            persisting_symbols_table, persisting_symbols_table_visible,
            persisting_symbols_delta, symbols_changed
        ] = self.generatePersistingSymbolsTableHTML()
        [
            disappeared_symbols_table, disappeared_symbols_table_visible,
            disappeared_symbols_size
        ] = self.generateDisappearedSymbolsTableHTML()
        [new_symbols_table, new_symbols_table_visible,
         new_symbols_size] = self.generateNewSymbolsTableHTML()
        [
            similar_symbols_table, similar_symbols_table_visible,
            num_similar_symbols
        ] = self.generateSimilarSymbolsTableHTML()

        if self.settings.build_info == "":
            build_info_visible = False
        else:
            build_info_visible = True

        binary_details_visible = False
        if self.settings.old_binary_info == "":
            old_binary_info_visible = False
        else:
            old_binary_info_visible = True
            binary_details_visible = True

        if self.settings.new_binary_info == "":
            new_binary_info_visible = False
        else:
            new_binary_info_visible = True
            binary_details_visible = True

        return {
            "page_title":
            u"ELF Binary Comparison - (c) 2019 by noseglasses",
            "doc_title":
            doc_title,
            "elf_diff_repo_base":
            self.settings.repo_path,
            "old_binary_file":
            html.escapeString(self.settings.old_alias),
            "new_binary_file":
            html.escapeString(self.settings.new_alias),
            "code_size_old_overall":
            str(old_binary.progmem_size),
            "code_size_new_overall":
            str(new_binary.progmem_size),
            "code_size_change_overall":
            html.formatNumberDelta(old_binary.progmem_size,
                                   new_binary.progmem_size),
            "static_ram_old_overall":
            str(old_binary.static_ram_size),
            "static_ram_new_overall":
            str(new_binary.static_ram_size),
            "static_ram_change_overall":
            html.formatNumberDelta(old_binary.static_ram_size,
                                   new_binary.static_ram_size),
            "text_size_old_overall":
            str(old_binary.text_size),
            "text_size_new_overall":
            str(new_binary.text_size),
            "text_size_change_overall":
            html.formatNumberDelta(old_binary.text_size, new_binary.text_size),
            "data_size_old_overall":
            str(old_binary.data_size),
            "data_size_new_overall":
            str(new_binary.data_size),
            "data_size_change_overall":
            html.formatNumberDelta(old_binary.data_size, new_binary.data_size),
            "bss_size_old_overall":
            str(old_binary.bss_size),
            "bss_size_new_overall":
            str(new_binary.bss_size),
            "bss_size_change_overall":
            html.formatNumberDelta(old_binary.bss_size, new_binary.bss_size),
            "total_symbols_old":
            str(len(old_binary.symbols.keys())),
            "total_symbols_new":
            str(len(new_binary.symbols.keys())),
            "num_persisting_symbols":
            str(len(self.binary_pair.persisting_symbol_names)),
            "num_disappeared_symbols":
            str(self.binary_pair.num_symbols_disappeared),
            "num_new_symbols":
            str(self.binary_pair.num_symbols_new),
            "num_similar_symbols":
            str(num_similar_symbols),
            "persisting_symbols_table_visible":
            persisting_symbols_table_visible,
            "disappeared_symbols_table_visible":
            disappeared_symbols_table_visible,
            "new_symbols_table_visible":
            new_symbols_table_visible,
            "similar_symbols_table_visible":
            similar_symbols_table_visible,
            "persisting_symbols_table":
            persisting_symbols_table,
            "disappeared_symbols_table":
            disappeared_symbols_table,
            "new_symbols_table":
            new_symbols_table,
            "similar_symbols_table":
            similar_symbols_table,
            "persisting_symbols_delta":
            persisting_symbols_delta,
            "disappeared_symbols_size":
            disappeared_symbols_size,
            "new_symbols_size":
            new_symbols_size,
            "details_visibility":
            details_visibility,
            "persisting_symbol_details_html":
            persisting_symbol_details_html,
            "disappeared_symbol_details_html":
            disappeared_symbol_details_html,
            "new_symbol_details_html":
            new_symbol_details_html,
            "similar_symbol_details_html":
            similar_symbol_details_html,
            "binary_details_visible":
            binary_details_visible,
            "old_binary_info_visible":
            old_binary_info_visible,
            "new_binary_info_visible":
            new_binary_info_visible,
            "old_binary_info":
            html.escapeString(self.settings.old_binary_info),
            "new_binary_info":
            html.escapeString(self.settings.new_binary_info),
            "build_info_visible":
            build_info_visible,
            "build_info":
            html.escapeString(self.settings.build_info),
            "date":
            datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            "symbols_changed":
            symbols_changed  # not escaped, do not print in the HTML
        }