#!/usr/bin/perl
#c88dd000 __insmod_nfsd_O/lib/modules/2.5.47/kernel/fs/nfsd/nfsd.o_M3DD2E9C8_V132399	[nfsd]
#c88dd080 __insmod_nfsd_S.text_L67226	[nfsd]
#c88ed71c __insmod_nfsd_S.rodata_L516	[nfsd]
#c88ef300 __insmod_nfsd_S.data_L3200	[nfsd]
#c88f0040 __insmod_nfsd_S.bss_L3504	[nfsd]


  $ksymsfile="/proc/ksyms";
  $gdbscript=".gdbmodulesyms";
  $modulename="";
  $modulefile="";
  $modulesecs="";

  open (KSYMS, "$ksymsfile");
  open (GDBSCRIPT, ">$gdbscript");

  do{
    $line=<KSYMS>;
    if ($line=~m/([0-9A-Fa-f]+) __insmod_(.+)_O(.+\.o)_[^\.]*/) {
      &LoadSyms;
      ($moduleaddr,$modulename,$modulefile) = $line =~ /([0-9A-Fa-f]+) __insmod_(.+)_O(.+\.o)_[^\.]*$/;
      print "Match module $modulename\n";
      $moduletext=$moduleaddr;
    }
    if ($line=~m/([0-9A-Fa-f]+) __insmod_(.+)_S(.+)_L[0-9]*/) {
      ($sectaddr,$modulename1,$sectname) = $line =~ /([0-9A-Fa-f]+) __insmod_(.+)_S(.+)_L[0-9]*/;
      print "Match section $sectname\n";
      if($modulename ne $modulename1) {
        print "Section mitchmatch"
      } else {
        if($sectname eq ".text") { $moduletext=$sectaddr; }
        $modulesecs="$modulesecs -s $sectname 0x$sectaddr";
      }
    }
    print "$l1";
  }while($line ne "");

  close KSYMS;
  close GDBSCRIPT;

  &LoadSyms;

  exit 0;

# add-symbol-file FILENAME -sSECTION ADDRESS ...
sub LoadSyms() {
  if ($modulename eq "") { return 1;}
  
  print GDBSCRIPT "add-symbol-file $modulefile 0x$moduletext $modulesecs\n";
  $modulename="";
  $modulefile="";
  $modulesecs="";
  return 1;
}


