From 779d3547b45cc562f9ff33704f29b622f29a0227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20=C3=98yvind=20Karlsen?= Date: Fri, 5 Mar 2010 12:59:47 +0000 Subject: don't duplicate stripping behaviour which is already done in find-debuginfo.sh --- check_elf_files | 86 ++++++++++++++++++++++++++++++++++++++ spec-helper.macros.in | 2 +- strip_and_check_elf_files | 103 ---------------------------------------------- 3 files changed, 87 insertions(+), 104 deletions(-) create mode 100755 check_elf_files delete mode 100755 strip_and_check_elf_files diff --git a/check_elf_files b/check_elf_files new file mode 100755 index 0000000..52c8161 --- /dev/null +++ b/check_elf_files @@ -0,0 +1,86 @@ +#!/usr/bin/perl +# $Id$ +# Strip files + +use strict; +use warnings; +use File::Find; +use File::Basename; + +my $buildroot = $ENV{RPM_BUILD_ROOT}; +die "No build root defined" unless $buildroot; +die "Invalid build root" unless -d $buildroot; +# normalize build root +$buildroot =~ s|/$||; + +# set LIBRARY_PATH to check libraries in build root +my $lib = `rpm --eval %_lib`; +chomp $lib; +$ENV{LD_LIBRARY_PATH}="$buildroot/$lib:$buildroot/usr/$lib"; + +my (@shared_libs, @executables, @static_libs); +find(\&keep_wanted, $buildroot); + +check_missing_or_unused_libs(); + +sub check_missing_or_unused_libs { + my $shift = length($buildroot); + foreach my $file (@shared_libs, @executables) { + my (undef, undef, @l) = `ldd -u -r $file 2>/dev/null`; + next unless @l; + my $file_ = substr($file, $shift); + print STDERR + "Warning: unused libraries in $file_: ", + join(' ', map { basename($_) } @l), "\n"; + } + foreach my $file (@shared_libs) { + my @l = `ldd -r $file 2>&1 >/dev/null`; + next unless @l; + my $file_ = substr($file, $shift); + print STDERR + "Warning: undefined symbols in $file_: ", + join(' ', map { /undefined symbol: (\S+)/ ? $1 : () } @l), "\n"; + } +} + +# TODO: we should write a binding for libfile... +sub expensive_test { + my ($file) = @_; + my $type = `file -- $file`; +} + +# Check if a file is an elf binary, shared library, or static library, +# for use by File::Find. It'll fill the following 3 arrays with anything +# it finds: +sub keep_wanted() { + # skip everything but files + return unless -f $_; + # skip symlinks + return if -l $_; + return if $File::Find::dir =~ m!/usr/lib/debug($|/)!; + + # Does its filename look like a shared library? + if (m/\.so/) { + # Ok, do the expensive test. + if (expensive_test($_) =~ m/ELF.*shared/) { + push @shared_libs, $File::Find::name; + return; + } + } + + # Is it executable? -x isn't good enough, so we need to use stat. + my (undef, undef, $mode, undef) = stat(_); + if ($mode & 0111) { + # Ok, expensive test. + if (expensive_test($_) =~ m/ELF.*executable/) { + push @executables, $File::Find::name; + return; + } + } + + # Is it a static library, and not a debug library? + if (m/lib.*\.a/ && ! m/_g\.a/) { + push @static_libs, $File::Find::name; + return; + } +} diff --git a/spec-helper.macros.in b/spec-helper.macros.in index 519a7ce..13af2f9 100644 --- a/spec-helper.macros.in +++ b/spec-helper.macros.in @@ -14,6 +14,6 @@ %{?!dont_fix_pamd: [ -n "$DONT_FIX_PAMD_CONFIGS" ] || %_spec_helper_dir/fix_pamd} \ %{?!dont_remove_info_dir: [ -n "$DONT_REMOVE_INFO_DIR" ] || %_spec_helper_dir/remove_info_dir} \ %{?!dont_fix_eol: [ -n "$DONT_FIX_EOL" ] || %_spec_helper_dir/fix_eol} \ - DONT_STRIP=%{?dont_strip:1}%{?!dont_strip:"$DONT_STRIP"} %_spec_helper_dir/strip_and_check_elf_files \ + %{?!dont_check_elf_files: [ -n "$DONT_CHECK_ELF_FILES" ] || %_spec_helper_dir/check_elf_files \ %nil diff --git a/strip_and_check_elf_files b/strip_and_check_elf_files deleted file mode 100755 index 5f7e84d..0000000 --- a/strip_and_check_elf_files +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/perl -# $Id$ -# Strip files - -use strict; -use warnings; -use File::Find; -use File::Basename; - -my $buildroot = $ENV{RPM_BUILD_ROOT}; -die "No build root defined" unless $buildroot; -die "Invalid build root" unless -d $buildroot; -# normalize build root -$buildroot =~ s|/$||; - -# set LIBRARY_PATH to check libraries in build root -my $lib = `rpm --eval %_lib`; -chomp $lib; -$ENV{LD_LIBRARY_PATH}="$buildroot/$lib:$buildroot/usr/$lib"; - -my (@shared_libs, @executables, @static_libs); -find(\&keep_wanted, $buildroot); - -strip_files() if !$ENV{DONT_STRIP}; -check_missing_or_unused_libs(); - -sub strip_files { - my @to_strip = (@shared_libs, @executables); - - if ($ENV{EXCLUDE_FROM_STRIP}) { - my $exclude_pattern = join('|', split(/\s+/, $ENV{EXCLUDE_FROM_STRIP})); - my $compiled_pattern = qr/($exclude_pattern)/; - @to_strip = grep { !/$compiled_pattern/ } @to_strip; - } - - system( - "strip", - "--remove-section=.comment", - "--remove-section=.note", - $_) foreach @to_strip; -} - -sub check_missing_or_unused_libs { - my $shift = length($buildroot); - foreach my $file (@shared_libs, @executables) { - my (undef, undef, @l) = `ldd -u -r $file 2>/dev/null`; - next unless @l; - my $file_ = substr($file, $shift); - print STDERR - "Warning: unused libraries in $file_: ", - join(' ', map { basename($_) } @l), "\n"; - } - foreach my $file (@shared_libs) { - my @l = `ldd -r $file 2>&1 >/dev/null`; - next unless @l; - my $file_ = substr($file, $shift); - print STDERR - "Warning: undefined symbols in $file_: ", - join(' ', map { /undefined symbol: (\S+)/ ? $1 : () } @l), "\n"; - } -} - -# TODO: we should write a binding for libfile... -sub expensive_test { - my ($file) = @_; - my $type = `file -- $file`; -} - -# Check if a file is an elf binary, shared library, or static library, -# for use by File::Find. It'll fill the following 3 arrays with anything -# it finds: -sub keep_wanted() { - # skip everything but files - return unless -f $_; - # skip symlinks - return if -l $_; - return if $File::Find::dir =~ m!/usr/lib/debug($|/)!; - - # Does its filename look like a shared library? - if (m/\.so/) { - # Ok, do the expensive test. - if (expensive_test($_) =~ m/ELF.*shared/) { - push @shared_libs, $File::Find::name; - return; - } - } - - # Is it executable? -x isn't good enough, so we need to use stat. - my (undef, undef, $mode, undef) = stat(_); - if ($mode & 0111) { - # Ok, expensive test. - if (expensive_test($_) =~ m/ELF.*executable/) { - push @executables, $File::Find::name; - return; - } - } - - # Is it a static library, and not a debug library? - if (m/lib.*\.a/ && ! m/_g\.a/) { - push @static_libs, $File::Find::name; - return; - } -} -- cgit v1.2.1