<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">#!/usr/bin/perl -w

use strict;
use warnings;

# Sort the symbol table portion of the output of objdump -ht by
# section, then by symbol value, then by size.  Used to enhance the
# linker maps produced by "make bin/%.map" by also showing the values
# of all non-global symbols.

my %section_idx = ( "*ABS*" =&gt; ".", "*UND*" =&gt; "_" );
my %lines;
while ( &lt;&gt; ) {
  if ( /^\s+(\d+)\s+([\.\*]\S+)\s+[0-9a-fA-F]+\s+[0-9a-fA-F]/ ) {
    # It's a header line containing a section definition; extract the
    # section index and store it.  Also print the header line.
    print;
    ( my $index, my $section ) = ( $1, $2 );
    $section_idx{$section} = sprintf ( "%02d", $index );
  } elsif ( /^([0-9a-fA-F]+)\s.*?\s([\.\*]\S+)\s+([0-9a-fA-F]+)\s+(\S+)/ ) {
    # It's a symbol line - store it in the hash, indexed by
    # "&lt;section_index&gt;:&lt;value&gt;:&lt;size&gt;:&lt;end_tag&gt;".  &lt;end_tag&gt; is "0" if
    # the symbol name is of the form xxx_end, "1" otherwise; this is
    # done so that table end markers show up before any other symbols
    # with the same value.
    ( my $value, my $section, my $size, my $name ) = ( $1, $2, $3, $4 );
    die "Unrecognised section \"$section\"\n"
	unless exists $section_idx{$section};
    my $section_idx = $section_idx{$section};
    my $end = ( $name =~ /_end$/ ) ? "0" : "1";
    my $key = $section_idx.":".$value.":".$size.":".$end;
    $lines{$key} ||= '';
    $lines{$key} .= $_;
  } else {
    # It's a generic header line: just print it.
    print;
  }
}

print $lines{$_} foreach sort keys %lines;
</pre></body></html>