f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉#!/usr/bin/env perl
d7201de09b85929a86b157f4b2d91667c68c6b52Automatic Updater#
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews# Copyright (C) 2009, 2012, 2016 Internet Systems Consortium, Inc. ("ISC")
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews#
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews# This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews# License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews# file, You can obtain one at http://mozilla.org/MPL/2.0/.
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉
ea94d370123a5892f6c47a97f21d1b28d44bb168Tinderbox User# $Id$
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉use strict;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉use diagnostics;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉$^W = 1;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉
ea94d370123a5892f6c47a97f21d1b28d44bb168Tinderbox Usermy $rev = '$Id$';
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉$rev =~ s/\$//g;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉$rev =~ s/,v//g;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉$rev =~ s/Id: //;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉use Getopt::Std;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉my %options;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉getopts('i:o:', \%options);
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉my ($binname, $need_uscorefix, $outputfile, $nsyms, $ostype, $nm_prog);
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉my %symmap;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉$binname = $ARGV[0];
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉$need_uscorefix = 0;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉if ($options{'o'}) {
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 $outputfile = $options{'o'};
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉} else {
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 $outputfile = "symtbl.c";
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉}
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉# OS-depending configuration
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉$nm_prog = "nm";
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉$ostype = `uname -s`;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉chop($ostype);
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉if ($ostype eq "SunOS" || $ostype eq "HP-UX") {
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 $nm_prog = "/usr/ccs/bin/nm -x"
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉}
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉if ($options{'i'}) {
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 open(SYMBOLS, $options{'i'}) || die "failed to open $options{'i'}";
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉} else {
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 open(SYMBOLS, "$nm_prog $binname |") ||
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 die "failed to invoke utility to get symbols";
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉}
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉open(TBLFILE, ">$outputfile") || die "failed to open output file: $outputfile";
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉$nsyms = 0;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉while (<SYMBOLS>) {
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 my ($addr, $symbol) = (0, "");
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 if ($ostype eq "SunOS") {
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 if (/\[\d*\]\s*\|\s*0x([0-9a-f]*)\|\s*0x[0-9a-f]*\|FUNC\s*(.*)\|([^|]+)$/) {
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 next if ($2 =~ /UNDEF/); # skip undefined symbols
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 $addr = $1;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 $symbol = $3;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 chop($symbol);
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 }
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 } elsif ($ostype eq "HP-UX") {
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 if (/(\S*)\s*\|0x([0-9a-f]*)\|([^|]*\|entry|extern\|code)/) {
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 $addr = $2;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 $symbol = $1;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 # this filter catches a massive number of awkward
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 # symbols such as "$START$". we are not interested in
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 # those and ignore them.
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 next if ($symbol =~ /\$/);
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 }
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 } else {
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 # *BSDs, Linux, etc.
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 if (/([0-9a-f]*)\s[tT]\s(.*)/) {
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 ($addr, $symbol) = ($1, $2);
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 # heuristics: some compilers add a "_" to all program
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 # defined symbols. Detect and fix it for a well known
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 # symbol of "main".
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 $need_uscorefix = 1 if ($symbol eq "_main");
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 }
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 }
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 if ($symbol ne "") {
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 # XXX: HP-UX's nm can produce a duplicate entry for the same
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 # address. Ignore duplicate entries except the first one.
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 next if ($symmap{$addr});
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 $symmap{$addr} = $symbol;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 $nsyms++;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 }
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉}
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉
c2e614115b19a4c28e0067e57a48f4ed5d5e12f8Mark Andrewssub lhex {
c2e614115b19a4c28e0067e57a48f4ed5d5e12f8Mark Andrews my $la = substr($a, -8);
c2e614115b19a4c28e0067e57a48f4ed5d5e12f8Mark Andrews my $lb = substr($b, -8);
c2e614115b19a4c28e0067e57a48f4ed5d5e12f8Mark Andrews my $ha = substr($a, 0, length($a) - length($la));
c2e614115b19a4c28e0067e57a48f4ed5d5e12f8Mark Andrews my $hb = substr($b, 0, length($b) - length($lb));
c2e614115b19a4c28e0067e57a48f4ed5d5e12f8Mark Andrews $ha = "0" if ($ha eq "");
c2e614115b19a4c28e0067e57a48f4ed5d5e12f8Mark Andrews $ha = "0" if ($hb eq "");
c2e614115b19a4c28e0067e57a48f4ed5d5e12f8Mark Andrews if (hex($ha) != hex($hb)) {
c2e614115b19a4c28e0067e57a48f4ed5d5e12f8Mark Andrews $la = $ha;
c2e614115b19a4c28e0067e57a48f4ed5d5e12f8Mark Andrews $lb = $hb;
c2e614115b19a4c28e0067e57a48f4ed5d5e12f8Mark Andrews }
c2e614115b19a4c28e0067e57a48f4ed5d5e12f8Mark Andrews hex($la) <=> hex($lb)
c2e614115b19a4c28e0067e57a48f4ed5d5e12f8Mark Andrews}
c2e614115b19a4c28e0067e57a48f4ed5d5e12f8Mark Andrews
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉print TBLFILE "/*\n * Generated by $rev \n */\n";
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉print TBLFILE "#include <isc/backtrace.h>\n";
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉print TBLFILE "const int isc__backtrace_nsymbols = $nsyms;\n";
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉print TBLFILE "const isc_backtrace_symmap_t isc__backtrace_symtable[] = {\n";
c2e614115b19a4c28e0067e57a48f4ed5d5e12f8Mark Andrewsforeach (sort lhex keys(%symmap)) {
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 my ($addr, $symbol) = ($_, $symmap{$_});
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 if ($need_uscorefix && $symbol =~ /^_(.*)/) {
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 $symbol = $1;
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 }
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉 print TBLFILE "\t{ (void *)0x$addr, \"$symbol\" },\n";
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉}
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉print TBLFILE "\t{ (void *)0x0, \"\" },\n";
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉print TBLFILE "};\n";
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉close(TBLFILE);
f909fbf73cec86a4166c82976a5e58ddb389bbe2Tatuya JINMEI 神明達哉close(SYMBOLS);