Author: djpig
Date: 2007-07-08 19:56:04 +0000 (Sun, 08 Jul 2007)
New Revision: 850
Added:
branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Shlibs/Objdump.pm
branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Shlibs/SymbolFile.pm
Removed:
branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Objdump.pm
branches/dpkg-shlibdeps-buxy/scripts/Dpkg/SymbolFile.pm
Modified:
branches/dpkg-shlibdeps-buxy/configure.ac
branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Makefile.am
Log:
Complete reordering of directories
Move SymbolFile.pm and Objdump.pm into the Shlibs directory
Adapt Makefile.am
Fix a remaining reference to scripts/modules in configure.ac
Modified: branches/dpkg-shlibdeps-buxy/configure.ac
===================================================================
--- branches/dpkg-shlibdeps-buxy/configure.ac 2007-07-08 19:49:48 UTC (rev
849)
+++ branches/dpkg-shlibdeps-buxy/configure.ac 2007-07-08 19:56:04 UTC (rev
850)
@@ -112,7 +112,7 @@
origins/Makefile
po/Makefile.in
scripts/Makefile
- scripts/modules/Makefile
+ scripts/Dpkg/Makefile
scripts/po/Makefile.in
src/Makefile
utils/Makefile ])
Modified: branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Makefile.am
===================================================================
--- branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Makefile.am 2007-07-08
19:49:48 UTC (rev 849)
+++ branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Makefile.am 2007-07-08
19:56:04 UTC (rev 850)
@@ -2,6 +2,6 @@
shlibsmodulesdir=$(pkglibdir)/Dpkg/Shlibs
dpkgmodulesdir=$(pkglibdir)/Dpkg
-dist_shlibsmodules_DATA = Objdump.pm SymbolFile.pm
+dist_shlibsmodules_DATA = Shlibs/Objdump.pm Shlibs/SymbolFile.pm
dist_dpkgmodules_DATA = Shlibs.pm Version.pm
Deleted: branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Objdump.pm
===================================================================
--- branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Objdump.pm 2007-07-08
19:49:48 UTC (rev 849)
+++ branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Objdump.pm 2007-07-08
19:56:04 UTC (rev 850)
@@ -1,252 +0,0 @@
-# Copyright (C) 2007 Raphael Hertzog
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-package Dpkg::Shlibs::Objdump;
-
-require 'dpkg-gettext.pl';
-
-sub new {
- my $this = shift;
- my $class = ref($this) || $this;
- my $self = { 'objects' => {} };
- bless $self, $class;
- return $self;
-}
-
-sub parse {
- my ($self, $file) = @_;
- local $ENV{LC_ALL} = 'C';
- open(OBJDUMP, "-|", "objdump", "-w", "-p", "-T", $file) ||
- syserr(sprintf(_g("Can't execute objdump: %s"), $!));
- my $obj = Dpkg::Shlibs::Objdump::Object->new($file);
- my $section = "none";
- while (defined($_ = <OBJDUMP>)) {
- chomp($_);
- next if (/^\s*$/);
-
- if ($_ =~ /^DYNAMIC SYMBOL TABLE:/) {
- $section = "dynsym";
- next;
- } elsif ($_ =~ /^Dynamic Section:/) {
- $section = "dyninfo";
- next;
- } elsif ($_ =~ /^Program Header:/) {
- $section = "header";
- next;
- } elsif ($_ =~ /^Version definitions:/) {
- $section = "verdef";
- next;
- } elsif ($_ =~ /^Version References:/) {
- $section = "verref";
- next;
- }
-
- if ($section eq "dynsym") {
- $self->parse_dynamic_symbol($_, $obj);
- } elsif ($section eq "dyninfo") {
- if ($_ =~ /^\s*NEEDED\s+(\S+)/) {
- push @{$obj->{NEEDED}}, $1;
- } elsif ($_ =~ /^\s*SONAME\s+(\S+)/) {
- $obj->{SONAME} = $1;
- } elsif ($_ =~ /^\s*HASH\s+(\S+)/) {
- $obj->{HASH} = $1;
- } elsif ($_ =~ /^\s*GNU_HASH\s+(\S+)/) {
- $obj->{GNU_HASH} = $1;
- } elsif ($_ =~ /^\s*RPATH\s+(\S+)/) {
- push @{$obj->{RPATH}}, split (/:/, $1);
- }
- } elsif ($section eq "none") {
- if ($_ =~ /^\s*\S+:\s*file\s+format\s+(\S+)\s*$/) {
- $obj->{format} = $1;
- }
- }
- }
- close(OBJDUMP);
- if ($section eq "none") {
- return undef;
- } else {
- my $id = $obj->{SONAME} || $obj->{file};
- $self->{objects}{$id} = $obj;
- return $id;
- }
-}
-
-# Output format of objdump -w -T
-#
-# /lib/libc.so.6: file format elf32-i386
-#
-# DYNAMIC SYMBOL TABLE:
-# 00056ef0 g DF .text 000000db GLIBC_2.2 getwchar
-# 00000000 g DO *ABS* 00000000 GCC_3.0 GCC_3.0
-# 00069960 w DF .text 0000001e GLIBC_2.0 bcmp
-# 00000000 w D *UND* 00000000 _pthread_cleanup_pop_restore
-# 0000b788 g DF .text 0000008e Base .protected xine_close
-# | ||||||| | | | |
-# | ||||||| | | Version str (.visibility) + Symbol name
-# | ||||||| | Alignment
-# | ||||||| Section name (or *UND* for an undefined symbol)
-# | ||||||F=Function,f=file,O=object
-# | |||||d=debugging,D=dynamic
-# | ||||I=Indirect
-# | |||W=warning
-# | ||C=constructor
-# | |w=weak
-# | g=global,l=local,!=both global/local
-# Size of the symbol
-#
-# GLIBC_2.2 is the version string associated to the symbol
-# (GLIBC_2.2) is the same but the symbol is hidden, a newer version of the
-# symbol exist
-
-sub parse_dynamic_symbol {
- my ($self, $line, $obj) = @_;
- my $vis = '(?:\s+(?:\.protected|\.hidden|\.internal|0x\S+))?';
- if ($line =~ /^[0-9a-f]+
(.{7})\s+(\S+)\s+[0-9a-f]+\s+(\S+)?(?:$vis\s+(\S+))/) {
-
- my ($flags, $sect, $ver, $name) = ($1, $2, $3, $4);
- my $symbol = {
- 'name' => $name,
- 'version' => defined($ver) ? $ver : '',
- 'section' => $sect,
- 'dynamic' => substr($flags, 5, 1) eq "D",
- 'debug' => substr($flags, 5, 1) eq "d",
- 'type' => substr($flags, 6, 1),
- 'weak' => substr($flags, 1, 1) eq "w",
- 'hidden' => 0,
- 'defined' => $sect ne '*UND*'
- };
-
- # Handle hidden symbols
- if (defined($ver) and $ver =~ /^\((.*)\)$/) {
- $ver = $1;
- $symbol->{'version'} = $1;
- $symbol->{'hidden'} = 1;
- }
-
- # Register symbol
- $obj->add_dynamic_symbol($symbol);
- } elsif ($line =~ /^[0-9a-f]+ (.{7})\s+(\S+)\s+[0-9a-f]+/) {
- # Same start but no version and no symbol ... just ignore
- } else {
- main::warning(sprintf(_g("Couldn't parse one line of objdump's output:
%s"), $line));
- }
-}
-
-sub locate_symbol {
- my ($self, $name) = @_;
- foreach my $obj (values %{$self->{objects}}) {
- my $sym = $obj->get_symbol($name);
- if (defined($sym) && $sym->{defined}) {
- return $sym;
- }
- }
- return undef;
-}
-
-sub get_object {
- my ($self, $objid) = @_;
- if (exists $self->{objects}{$objid}) {
- return $self->{objects}{$objid};
- }
- return undef;
-}
-
-{
- my %format; # Cache of result
- sub get_format {
- my ($file) = @_;
-
- if (exists $format{$file}) {
- return $format{$file};
- } else {
- local $ENV{LC_ALL} = "C";
- open(P, "objdump -a -- $file |") || syserr(_g("cannot fork for
objdump"));
- while (<P>) {
- chomp;
- if (/^\s*\S+:\s*file\s+format\s+(\S+)\s*$/) {
- $format{$file} = $1;
- return $format{$file};
- }
- }
- close(P) or main::subprocerr(sprintf(_g("objdump on \`%s'"),
$file));
- }
- }
-}
-
-sub is_elf {
- my ($file) = @_;
- open(FILE, "<", $file) || main::syserr(sprintf(_g("Can't open %s for test:
%s"), $file, $!));
- my ($header, $result) = ("", 0);
- if (read(FILE, $header, 4) == 4) {
- $result = 1 if ($header =~ /^\177ELF$/);
- }
- close(FILE);
- return $result;
-}
-
-package Dpkg::Shlibs::Objdump::Object;
-
-sub new {
- my $this = shift;
- my $file = shift || '';
- my $class = ref($this) || $this;
- my $self = {
- 'file' => $file,
- 'SONAME' => '',
- 'NEEDED' => [],
- 'RPATH' => [],
- 'dynsyms' => {}
- };
- bless $self, $class;
- return $self;
-}
-
-sub add_dynamic_symbol {
- my ($self, $symbol) = @_;
- $symbol->{soname} = $self->{SONAME};
- if ($symbol->{version}) {
- $self->{dynsyms}{$symbol->{name} . '@' . $symbol->{version}} = $symbol;
- } else {
- $self->{dynsyms}{$symbol->{name}} = $symbol;
- }
-}
-
-sub get_symbol {
- my ($self, $name) = @_;
- if (exists $self->{dynsyms}{$name}) {
- return $self->{dynsyms}{$name};
- }
- return undef;
-}
-
-sub get_exported_dynamic_symbols {
- my ($self) = @_;
- return grep { $_->{defined} && $_->{dynamic} }
- values %{$self->{dynsyms}};
-}
-
-sub get_undefined_dynamic_symbols {
- my ($self) = @_;
- return grep { (!$_->{defined}) && $_->{dynamic} }
- values %{$self->{dynsyms}};
-}
-
-sub get_needed_libraries {
- my $self = shift;
- return @{$self->{NEEDED}};
-}
-
-1;
Copied: branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Shlibs/Objdump.pm (from rev
849, branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Objdump.pm)
===================================================================
--- branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Shlibs/Objdump.pm
(rev 0)
+++ branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Shlibs/Objdump.pm 2007-07-08
19:56:04 UTC (rev 850)
@@ -0,0 +1,252 @@
+# Copyright (C) 2007 Raphael Hertzog
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+package Dpkg::Shlibs::Objdump;
+
+require 'dpkg-gettext.pl';
+
+sub new {
+ my $this = shift;
+ my $class = ref($this) || $this;
+ my $self = { 'objects' => {} };
+ bless $self, $class;
+ return $self;
+}
+
+sub parse {
+ my ($self, $file) = @_;
+ local $ENV{LC_ALL} = 'C';
+ open(OBJDUMP, "-|", "objdump", "-w", "-p", "-T", $file) ||
+ syserr(sprintf(_g("Can't execute objdump: %s"), $!));
+ my $obj = Dpkg::Shlibs::Objdump::Object->new($file);
+ my $section = "none";
+ while (defined($_ = <OBJDUMP>)) {
+ chomp($_);
+ next if (/^\s*$/);
+
+ if ($_ =~ /^DYNAMIC SYMBOL TABLE:/) {
+ $section = "dynsym";
+ next;
+ } elsif ($_ =~ /^Dynamic Section:/) {
+ $section = "dyninfo";
+ next;
+ } elsif ($_ =~ /^Program Header:/) {
+ $section = "header";
+ next;
+ } elsif ($_ =~ /^Version definitions:/) {
+ $section = "verdef";
+ next;
+ } elsif ($_ =~ /^Version References:/) {
+ $section = "verref";
+ next;
+ }
+
+ if ($section eq "dynsym") {
+ $self->parse_dynamic_symbol($_, $obj);
+ } elsif ($section eq "dyninfo") {
+ if ($_ =~ /^\s*NEEDED\s+(\S+)/) {
+ push @{$obj->{NEEDED}}, $1;
+ } elsif ($_ =~ /^\s*SONAME\s+(\S+)/) {
+ $obj->{SONAME} = $1;
+ } elsif ($_ =~ /^\s*HASH\s+(\S+)/) {
+ $obj->{HASH} = $1;
+ } elsif ($_ =~ /^\s*GNU_HASH\s+(\S+)/) {
+ $obj->{GNU_HASH} = $1;
+ } elsif ($_ =~ /^\s*RPATH\s+(\S+)/) {
+ push @{$obj->{RPATH}}, split (/:/, $1);
+ }
+ } elsif ($section eq "none") {
+ if ($_ =~ /^\s*\S+:\s*file\s+format\s+(\S+)\s*$/) {
+ $obj->{format} = $1;
+ }
+ }
+ }
+ close(OBJDUMP);
+ if ($section eq "none") {
+ return undef;
+ } else {
+ my $id = $obj->{SONAME} || $obj->{file};
+ $self->{objects}{$id} = $obj;
+ return $id;
+ }
+}
+
+# Output format of objdump -w -T
+#
+# /lib/libc.so.6: file format elf32-i386
+#
+# DYNAMIC SYMBOL TABLE:
+# 00056ef0 g DF .text 000000db GLIBC_2.2 getwchar
+# 00000000 g DO *ABS* 00000000 GCC_3.0 GCC_3.0
+# 00069960 w DF .text 0000001e GLIBC_2.0 bcmp
+# 00000000 w D *UND* 00000000 _pthread_cleanup_pop_restore
+# 0000b788 g DF .text 0000008e Base .protected xine_close
+# | ||||||| | | | |
+# | ||||||| | | Version str (.visibility) + Symbol name
+# | ||||||| | Alignment
+# | ||||||| Section name (or *UND* for an undefined symbol)
+# | ||||||F=Function,f=file,O=object
+# | |||||d=debugging,D=dynamic
+# | ||||I=Indirect
+# | |||W=warning
+# | ||C=constructor
+# | |w=weak
+# | g=global,l=local,!=both global/local
+# Size of the symbol
+#
+# GLIBC_2.2 is the version string associated to the symbol
+# (GLIBC_2.2) is the same but the symbol is hidden, a newer version of the
+# symbol exist
+
+sub parse_dynamic_symbol {
+ my ($self, $line, $obj) = @_;
+ my $vis = '(?:\s+(?:\.protected|\.hidden|\.internal|0x\S+))?';
+ if ($line =~ /^[0-9a-f]+
(.{7})\s+(\S+)\s+[0-9a-f]+\s+(\S+)?(?:$vis\s+(\S+))/) {
+
+ my ($flags, $sect, $ver, $name) = ($1, $2, $3, $4);
+ my $symbol = {
+ 'name' => $name,
+ 'version' => defined($ver) ? $ver : '',
+ 'section' => $sect,
+ 'dynamic' => substr($flags, 5, 1) eq "D",
+ 'debug' => substr($flags, 5, 1) eq "d",
+ 'type' => substr($flags, 6, 1),
+ 'weak' => substr($flags, 1, 1) eq "w",
+ 'hidden' => 0,
+ 'defined' => $sect ne '*UND*'
+ };
+
+ # Handle hidden symbols
+ if (defined($ver) and $ver =~ /^\((.*)\)$/) {
+ $ver = $1;
+ $symbol->{'version'} = $1;
+ $symbol->{'hidden'} = 1;
+ }
+
+ # Register symbol
+ $obj->add_dynamic_symbol($symbol);
+ } elsif ($line =~ /^[0-9a-f]+ (.{7})\s+(\S+)\s+[0-9a-f]+/) {
+ # Same start but no version and no symbol ... just ignore
+ } else {
+ main::warning(sprintf(_g("Couldn't parse one line of objdump's output:
%s"), $line));
+ }
+}
+
+sub locate_symbol {
+ my ($self, $name) = @_;
+ foreach my $obj (values %{$self->{objects}}) {
+ my $sym = $obj->get_symbol($name);
+ if (defined($sym) && $sym->{defined}) {
+ return $sym;
+ }
+ }
+ return undef;
+}
+
+sub get_object {
+ my ($self, $objid) = @_;
+ if (exists $self->{objects}{$objid}) {
+ return $self->{objects}{$objid};
+ }
+ return undef;
+}
+
+{
+ my %format; # Cache of result
+ sub get_format {
+ my ($file) = @_;
+
+ if (exists $format{$file}) {
+ return $format{$file};
+ } else {
+ local $ENV{LC_ALL} = "C";
+ open(P, "objdump -a -- $file |") || syserr(_g("cannot fork for
objdump"));
+ while (<P>) {
+ chomp;
+ if (/^\s*\S+:\s*file\s+format\s+(\S+)\s*$/) {
+ $format{$file} = $1;
+ return $format{$file};
+ }
+ }
+ close(P) or main::subprocerr(sprintf(_g("objdump on \`%s'"),
$file));
+ }
+ }
+}
+
+sub is_elf {
+ my ($file) = @_;
+ open(FILE, "<", $file) || main::syserr(sprintf(_g("Can't open %s for test:
%s"), $file, $!));
+ my ($header, $result) = ("", 0);
+ if (read(FILE, $header, 4) == 4) {
+ $result = 1 if ($header =~ /^\177ELF$/);
+ }
+ close(FILE);
+ return $result;
+}
+
+package Dpkg::Shlibs::Objdump::Object;
+
+sub new {
+ my $this = shift;
+ my $file = shift || '';
+ my $class = ref($this) || $this;
+ my $self = {
+ 'file' => $file,
+ 'SONAME' => '',
+ 'NEEDED' => [],
+ 'RPATH' => [],
+ 'dynsyms' => {}
+ };
+ bless $self, $class;
+ return $self;
+}
+
+sub add_dynamic_symbol {
+ my ($self, $symbol) = @_;
+ $symbol->{soname} = $self->{SONAME};
+ if ($symbol->{version}) {
+ $self->{dynsyms}{$symbol->{name} . '@' . $symbol->{version}} = $symbol;
+ } else {
+ $self->{dynsyms}{$symbol->{name}} = $symbol;
+ }
+}
+
+sub get_symbol {
+ my ($self, $name) = @_;
+ if (exists $self->{dynsyms}{$name}) {
+ return $self->{dynsyms}{$name};
+ }
+ return undef;
+}
+
+sub get_exported_dynamic_symbols {
+ my ($self) = @_;
+ return grep { $_->{defined} && $_->{dynamic} }
+ values %{$self->{dynsyms}};
+}
+
+sub get_undefined_dynamic_symbols {
+ my ($self) = @_;
+ return grep { (!$_->{defined}) && $_->{dynamic} }
+ values %{$self->{dynsyms}};
+}
+
+sub get_needed_libraries {
+ my $self = shift;
+ return @{$self->{NEEDED}};
+}
+
+1;
Copied: branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Shlibs/SymbolFile.pm (from
rev 849, branches/dpkg-shlibdeps-buxy/scripts/Dpkg/SymbolFile.pm)
===================================================================
--- branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Shlibs/SymbolFile.pm
(rev 0)
+++ branches/dpkg-shlibdeps-buxy/scripts/Dpkg/Shlibs/SymbolFile.pm
2007-07-08 19:56:04 UTC (rev 850)
@@ -0,0 +1,253 @@
+# Copyright (C) 2007 Raphael Hertzog
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+package Dpkg::Shlibs::SymbolFile;
+
+require 'dpkg-gettext.pl';
+
+use Dpkg::Version qw(compare_versions);
+
+sub new {
+ my $this = shift;
+ my $file = shift;
+ my $class = ref($this) || $this;
+ my $self = { };
+ bless $self, $class;
+ if (defined($file) ) {
+ $self->{file} = $file;
+ $self->load($file) if -e $file;
+ }
+ return $self;
+}
+
+sub clear {
+ my ($self) = @_;
+ $self->{objects} = {};
+}
+
+sub clear_except {
+ my ($self, @ids) = @_;
+ my %has;
+ $has{$_} = 1 foreach (@ids);
+ foreach my $objid (keys %{$self->{objects}}) {
+ delete $self->{objects}{$objid} unless exists $has{$objid};
+ }
+}
+
+sub load {
+ my ($self, $file) = @_;
+ $self->{file} = $file;
+ open(SYM_FILE, "<", $file) || main::syserr(sprintf(_g("Can't open %s:
%s"), $file));
+ my ($object);
+ while (defined($_ = <SYM_FILE>)) {
+ chomp($_);
+ if (/^\s+(\S+)\s(\S+)(?:\s(\d+))?/) {
+ # New symbol
+ my $sym = {
+ 'minver' => $2,
+ 'dep_id' => defined($3) ? $3 : 0,
+ 'deprecated' => 0
+ };
+ $self->{objects}{$object}{syms}{$1} = $sym;
+ } elsif (/^#DEPRECATED: ([^#]+)#\s*(\S+)\s(\S+)(?:\s(\d+))?/) {
+ my $sym = {
+ 'minver' => $3,
+ 'dep_id' => defined($4) ? $4 : 0,
+ 'deprecated' => $1
+ };
+ $self->{objects}{$object}{syms}{$2} = $sym;
+ } elsif (/^\|\s*(.*)$/) {
+ # Alternative dependency template
+ push @{$self->{objects}{$object}{deps}}, "$1";
+ } elsif (/^(\S+)\s+(.*)$/) {
+ # New object and dependency template
+ $object = $1;
+ $self->{objects}{$object} = {
+ 'syms' => {},
+ 'deps' => [ "$2" ]
+ };
+ } else {
+ main::warning(sprintf(_g("Failed to parse a line in %s: %s"),
$file, $_));
+ }
+ }
+ close(SYM_FILE);
+}
+
+sub save {
+ my ($self, $file) = @_;
+ $file = $self->{file} unless defined($file);
+ my $fh;
+ if ($file eq "-") {
+ $fh = \*STDOUT;
+ } else {
+ open(SYM_FILE, "> $file") || main::syserr(sprintf(_g("Can't open %s for
writing: %s"), $file, $!));
+ $fh = \*SYM_FILE;
+ }
+ $self->dump($fh);
+ close($fh) if ($file ne "-");
+}
+
+sub dump {
+ my ($self, $fh) = @_;
+ foreach my $soname (sort keys %{$self->{objects}}) {
+ print $fh "$soname $self->{objects}{$soname}{deps}[0]\n";
+ print $fh "| $_" foreach (@{$self->{objects}{$soname}{deps}}[ 1 .. -1
]);
+ foreach my $sym (sort keys %{$self->{objects}{$soname}{syms}}) {
+ my $info = $self->{objects}{$soname}{syms}{$sym};
+ print $fh "#DEPRECATED: $info->{deprecated}#" if
$info->{deprecated};
+ print $fh " $sym $info->{minver}";
+ print $fh " $info->{dep_id}" if $info->{dep_id};
+ print $fh "\n";
+ }
+ }
+}
+
+# merge_symbols($object, $minver)
+# Needs $Objdump->get_object($soname) as parameter
+sub merge_symbols {
+ my ($self, $object, $minver) = @_;
+ my $soname = $object->{SONAME} || main::error(_g("Can't merge symbols from
objects without SONAME."));
+ my %dynsyms = map { $_ => $object->{dynsyms}{$_} }
+ grep { local $a = $object->{dynsyms}{$_}; $a->{dynamic} &&
$a->{defined} }
+ keys %{$object->{dynsyms}};
+ # Scan all symbols provided by the objects
+ foreach my $sym (keys %dynsyms) {
+ if (exists $self->{objects}{$soname}{syms}{$sym}) {
+ # If the symbol is already listed in the file
+ my $info = $self->{objects}{$soname}{syms}{$sym};
+ if ($info->{deprecated}) {
+ # Symbol reappeared somehow
+ $info->{deprecated} = 0;
+ $info->{minver} = $minver;
+ next;
+ }
+ # We assume that the right dependency information is already
+ # there.
+ if (compare_versions($minver, "lt", $info->{minver})) {
+ $info->{minver} = $minver;
+ }
+ } else {
+ # The symbol is new and not present in the file
+ my $info = {
+ 'minver' => $minver,
+ 'deprecated' => 0,
+ 'dep_id' => 0
+ };
+ $self->{objects}{$soname}{syms}{$sym} = $info;
+ }
+ }
+
+ # Scan all symbols in the file and mark as deprecated those that are
+ # no more provided
+ foreach my $sym (keys %{$self->{objects}{$soname}{syms}}) {
+ if (! exists $dynsyms{$sym}) {
+ $self->{objects}{$soname}{syms}{$sym}{deprecated} = $minver;
+ }
+ }
+}
+
+sub has_object {
+ my ($self, $soname) = @_;
+ return exists $self->{objects}{$soname};
+}
+
+sub create_object {
+ my ($self, $soname, @deps) = @_;
+ $self->{objects}{$soname} = {
+ "syms" => {},
+ "deps" => [ @deps ]
+ };
+}
+
+sub get_dependency {
+ my ($self, $soname, $dep_id) = @_;
+ $dep_id = 0 unless defined($dep_id);
+ return $self->{objects}{$soname}{deps}[$dep_id];
+}
+
+sub lookup_symbol {
+ my ($self, $name, $sonames) = @_;
+ foreach my $so (@{$sonames}) {
+ next if (! exists $self->{objects}{$so});
+ if (exists $self->{objects}{$so}{syms}{$name} and
+ not $self->{objects}{$so}{syms}{$name}{deprecated})
+ {
+ my $dep_id = $self->{objects}{$so}{syms}{$name}{dep_id};
+ return {
+ 'depends' => $self->{objects}{$so}{deps}[$dep_id],
+ 'soname' => $so,
+ %{$self->{objects}{$so}{syms}{$name}}
+ };
+ }
+ }
+ return undef;
+}
+
+sub has_lost_symbols {
+ my ($self, $ref) = @_;
+ foreach my $soname (keys %{$self->{objects}}) {
+ my $mysyms = $self->{objects}{$soname}{syms};
+ next if not exists $ref->{objects}{$soname};
+ my $refsyms = $ref->{objects}{$soname}{syms};
+ foreach my $sym (grep { not $refsyms->{$_}{deprecated} }
+ keys %{$refsyms})
+ {
+ if ((not exists $mysyms->{$sym}) or
+ $mysyms->{$sym}{deprecated})
+ {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+sub has_new_symbols {
+ my ($self, $ref) = @_;
+ foreach my $soname (keys %{$self->{objects}}) {
+ my $mysyms = $self->{objects}{$soname}{syms};
+ next if not exists $ref->{objects}{$soname};
+ my $refsyms = $ref->{objects}{$soname}{syms};
+ foreach my $sym (grep { not $mysyms->{$_}{deprecated} }
+ keys %{$mysyms})
+ {
+ if ((not exists $refsyms->{$sym}) or
+ $refsyms->{$sym}{deprecated})
+ {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+sub has_new_libs {
+ my ($self, $ref) = @_;
+ foreach my $soname (keys %{$self->{objects}}) {
+ return 1 if not exists $ref->{objects}{$soname};
+ }
+ return 0;
+}
+
+sub has_lost_libs {
+ my ($self, $ref) = @_;
+ foreach my $soname (keys %{$ref->{objects}}) {
+ return 1 if not exists $self->{objects}{$soname};
+ }
+ return 0;
+}
+
+1;
Deleted: branches/dpkg-shlibdeps-buxy/scripts/Dpkg/SymbolFile.pm
===================================================================
--- branches/dpkg-shlibdeps-buxy/scripts/Dpkg/SymbolFile.pm 2007-07-08
19:49:48 UTC (rev 849)
+++ branches/dpkg-shlibdeps-buxy/scripts/Dpkg/SymbolFile.pm 2007-07-08
19:56:04 UTC (rev 850)
@@ -1,253 +0,0 @@
-# Copyright (C) 2007 Raphael Hertzog
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-package Dpkg::Shlibs::SymbolFile;
-
-require 'dpkg-gettext.pl';
-
-use Dpkg::Version qw(compare_versions);
-
-sub new {
- my $this = shift;
- my $file = shift;
- my $class = ref($this) || $this;
- my $self = { };
- bless $self, $class;
- if (defined($file) ) {
- $self->{file} = $file;
- $self->load($file) if -e $file;
- }
- return $self;
-}
-
-sub clear {
- my ($self) = @_;
- $self->{objects} = {};
-}
-
-sub clear_except {
- my ($self, @ids) = @_;
- my %has;
- $has{$_} = 1 foreach (@ids);
- foreach my $objid (keys %{$self->{objects}}) {
- delete $self->{objects}{$objid} unless exists $has{$objid};
- }
-}
-
-sub load {
- my ($self, $file) = @_;
- $self->{file} = $file;
- open(SYM_FILE, "<", $file) || main::syserr(sprintf(_g("Can't open %s:
%s"), $file));
- my ($object);
- while (defined($_ = <SYM_FILE>)) {
- chomp($_);
- if (/^\s+(\S+)\s(\S+)(?:\s(\d+))?/) {
- # New symbol
- my $sym = {
- 'minver' => $2,
- 'dep_id' => defined($3) ? $3 : 0,
- 'deprecated' => 0
- };
- $self->{objects}{$object}{syms}{$1} = $sym;
- } elsif (/^#DEPRECATED: ([^#]+)#\s*(\S+)\s(\S+)(?:\s(\d+))?/) {
- my $sym = {
- 'minver' => $3,
- 'dep_id' => defined($4) ? $4 : 0,
- 'deprecated' => $1
- };
- $self->{objects}{$object}{syms}{$2} = $sym;
- } elsif (/^\|\s*(.*)$/) {
- # Alternative dependency template
- push @{$self->{objects}{$object}{deps}}, "$1";
- } elsif (/^(\S+)\s+(.*)$/) {
- # New object and dependency template
- $object = $1;
- $self->{objects}{$object} = {
- 'syms' => {},
- 'deps' => [ "$2" ]
- };
- } else {
- main::warning(sprintf(_g("Failed to parse a line in %s: %s"),
$file, $_));
- }
- }
- close(SYM_FILE);
-}
-
-sub save {
- my ($self, $file) = @_;
- $file = $self->{file} unless defined($file);
- my $fh;
- if ($file eq "-") {
- $fh = \*STDOUT;
- } else {
- open(SYM_FILE, "> $file") || main::syserr(sprintf(_g("Can't open %s for
writing: %s"), $file, $!));
- $fh = \*SYM_FILE;
- }
- $self->dump($fh);
- close($fh) if ($file ne "-");
-}
-
-sub dump {
- my ($self, $fh) = @_;
- foreach my $soname (sort keys %{$self->{objects}}) {
- print $fh "$soname $self->{objects}{$soname}{deps}[0]\n";
- print $fh "| $_" foreach (@{$self->{objects}{$soname}{deps}}[ 1 .. -1
]);
- foreach my $sym (sort keys %{$self->{objects}{$soname}{syms}}) {
- my $info = $self->{objects}{$soname}{syms}{$sym};
- print $fh "#DEPRECATED: $info->{deprecated}#" if
$info->{deprecated};
- print $fh " $sym $info->{minver}";
- print $fh " $info->{dep_id}" if $info->{dep_id};
- print $fh "\n";
- }
- }
-}
-
-# merge_symbols($object, $minver)
-# Needs $Objdump->get_object($soname) as parameter
-sub merge_symbols {
- my ($self, $object, $minver) = @_;
- my $soname = $object->{SONAME} || main::error(_g("Can't merge symbols from
objects without SONAME."));
- my %dynsyms = map { $_ => $object->{dynsyms}{$_} }
- grep { local $a = $object->{dynsyms}{$_}; $a->{dynamic} &&
$a->{defined} }
- keys %{$object->{dynsyms}};
- # Scan all symbols provided by the objects
- foreach my $sym (keys %dynsyms) {
- if (exists $self->{objects}{$soname}{syms}{$sym}) {
- # If the symbol is already listed in the file
- my $info = $self->{objects}{$soname}{syms}{$sym};
- if ($info->{deprecated}) {
- # Symbol reappeared somehow
- $info->{deprecated} = 0;
- $info->{minver} = $minver;
- next;
- }
- # We assume that the right dependency information is already
- # there.
- if (compare_versions($minver, "lt", $info->{minver})) {
- $info->{minver} = $minver;
- }
- } else {
- # The symbol is new and not present in the file
- my $info = {
- 'minver' => $minver,
- 'deprecated' => 0,
- 'dep_id' => 0
- };
- $self->{objects}{$soname}{syms}{$sym} = $info;
- }
- }
-
- # Scan all symbols in the file and mark as deprecated those that are
- # no more provided
- foreach my $sym (keys %{$self->{objects}{$soname}{syms}}) {
- if (! exists $dynsyms{$sym}) {
- $self->{objects}{$soname}{syms}{$sym}{deprecated} = $minver;
- }
- }
-}
-
-sub has_object {
- my ($self, $soname) = @_;
- return exists $self->{objects}{$soname};
-}
-
-sub create_object {
- my ($self, $soname, @deps) = @_;
- $self->{objects}{$soname} = {
- "syms" => {},
- "deps" => [ @deps ]
- };
-}
-
-sub get_dependency {
- my ($self, $soname, $dep_id) = @_;
- $dep_id = 0 unless defined($dep_id);
- return $self->{objects}{$soname}{deps}[$dep_id];
-}
-
-sub lookup_symbol {
- my ($self, $name, $sonames) = @_;
- foreach my $so (@{$sonames}) {
- next if (! exists $self->{objects}{$so});
- if (exists $self->{objects}{$so}{syms}{$name} and
- not $self->{objects}{$so}{syms}{$name}{deprecated})
- {
- my $dep_id = $self->{objects}{$so}{syms}{$name}{dep_id};
- return {
- 'depends' => $self->{objects}{$so}{deps}[$dep_id],
- 'soname' => $so,
- %{$self->{objects}{$so}{syms}{$name}}
- };
- }
- }
- return undef;
-}
-
-sub has_lost_symbols {
- my ($self, $ref) = @_;
- foreach my $soname (keys %{$self->{objects}}) {
- my $mysyms = $self->{objects}{$soname}{syms};
- next if not exists $ref->{objects}{$soname};
- my $refsyms = $ref->{objects}{$soname}{syms};
- foreach my $sym (grep { not $refsyms->{$_}{deprecated} }
- keys %{$refsyms})
- {
- if ((not exists $mysyms->{$sym}) or
- $mysyms->{$sym}{deprecated})
- {
- return 1;
- }
- }
- }
- return 0;
-}
-
-sub has_new_symbols {
- my ($self, $ref) = @_;
- foreach my $soname (keys %{$self->{objects}}) {
- my $mysyms = $self->{objects}{$soname}{syms};
- next if not exists $ref->{objects}{$soname};
- my $refsyms = $ref->{objects}{$soname}{syms};
- foreach my $sym (grep { not $mysyms->{$_}{deprecated} }
- keys %{$mysyms})
- {
- if ((not exists $refsyms->{$sym}) or
- $refsyms->{$sym}{deprecated})
- {
- return 1;
- }
- }
- }
- return 0;
-}
-
-sub has_new_libs {
- my ($self, $ref) = @_;
- foreach my $soname (keys %{$self->{objects}}) {
- return 1 if not exists $ref->{objects}{$soname};
- }
- return 0;
-}
-
-sub has_lost_libs {
- my ($self, $ref) = @_;
- foreach my $soname (keys %{$ref->{objects}}) {
- return 1 if not exists $self->{objects}{$soname};
- }
- return 0;
-}
-
-1;
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]