Mercurial > hg > Game > Cerium
diff bin/cell_ovly_table.pl @ 471:e95d1047d15c draft
add library
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 01 Oct 2009 19:28:52 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bin/cell_ovly_table.pl Thu Oct 01 19:28:52 2009 +0900 @@ -0,0 +1,142 @@ +#!/usr/bin/perl +# // from readelf -all spu/spe_main +# // [12] .data PROGBITS 00000f20 0011a0 000384 00 WA 0 0 16 +# // 109: 00001260 64 OBJECT GLOBAL DEFAULT 12 _ovly_table + +use strict; + +package ReadElf; + +sub new { bless {} } + +sub readelf { + my ($self,$elf)= @_; + + my $debug = 0; + my $section_header; + my $symbol_table; + my %section; + my %symbol; + + $self->{section} = \%section; + $self->{symbol} = \%symbol; + + open(ELF, "readelf -all $elf |"); + while(<ELF>) { + if(/^Section Headers:/) { $section_header = 1 ; $symbol_table = 0; } + elsif(/^Symbol table/) { $section_header = 0 ; $symbol_table = 1; } + elsif(/^[A-Z]/) { $section_header = 0 ; $symbol_table = 0; } + if ($section_header) { + if (/\[\s*(\d+)\]\s+(\.\w+)\s+(\w+)\s+([\da-f]+)\s+([\da-f]+)\s+([\da-f]+)\s/) { + $section{$2} = {nr=>$1,name=>$2,type=>$3,addr=>$4,offset=>$5,size=>$6}; + } + } + if ($symbol_table) { + if(/^\s+(\d+):\s([\da-f]+)\s+([\da-f]+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+([\w\.\_]+)/) { + $symbol{$8} = {num=>$1,value=>$2,size=>$3,type=>$4,bind=>$5,vis=>$6,ndx=>$7,name=>$8}; + } + } + + } + + + if ($debug) { + print "seciton:\n"; + foreach my $key ( keys %section) { + foreach my $i ( keys %{$section{$key}}) { + print "$i=>$section{$key}->{$i} "; + } + print "\n"; + } + + print "symbol:\n"; + foreach my $key ( keys %symbol) { + foreach my $i ( keys %{$symbol{$key}}) { + print "$i=>$symbol{$key}->{$i} "; + } + print "\n"; + } + } + $self; +} + +sub symbol { + my ($self, $name) = @_; + $self->{symbol}->{$name}; +} + +sub segment { + my ($self, $name) = @_; + $self->{section}->{$name}; +} + + +package Main; + +my $elf = ReadElf->new; + +my $file = shift; +if (! -e $file) { + open(H,">runTask_offset.h"); + for my $header (@ARGV) { + open(HD,"<$header") or die("Can't open $header"); + my $class = $header; + my $entry = 0; + $class =~ s/\.cc//; + while(<HD>) { + if (/SchedDefineDynamicTask\(\s*(\w+)\s*,\s*(\d+)\s*\)/) { + print H "#define runTask_${class}_offset 0x$entry\n"; + last; + } + } + } + open(H,">ld.script.ed"); + exit(0); +} + +$elf->readelf($file) ; + +my $base = $elf->segment(".segment0")->{addr}; + +my @ldfiles; +my $ldsegment = ""; + +open(H,">runTask_offset.h"); +print H "#ifndef RUNTASK_OFFSET_H\n"; +print H "#define RUNTASK_OFFSET_H\n"; +for my $header (@ARGV) { + open(HD,"<$header") or die("Can't open $header"); + while(<HD>) { + if (/SchedDefineDynamicTask\(\s*(\w+)\s*,\s*(\d+)\s*\)/) { + my $class = $1; + my $segment = $2; + my $entry = $elf->symbol("runTask_$class")->{value}; + print H "#define runTask_${class}_offset (0x$entry-0x$base)\n"; + my $ofile = $header; + $ofile =~ s/\.cc/.o/; + push(@ldfiles,$ofile); + $ldsegment .= " .segment$segment { $ofile(.text) }\n"; + last; + } + } +} +print H "#endif\n"; + +my $ld_script = <<"EOFEOF"; +/ \\.text / +/\\\*\(\\.text/ +s/\\\*\(\\.text/\*\( EXCLUDE_FILE(@ldfiles) .text/ +/} =0/ +a + OVERLAY : + { +$ldsegment + } +. +w +EOFEOF + +open(H,">ld.script.ed"); +print H $ld_script; + +# end