diff options
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | spec-helper.macros.in | 2 | ||||
-rwxr-xr-x | strip_and_check_elf_files (renamed from strip_files) | 48 |
3 files changed, 38 insertions, 16 deletions
@@ -1,3 +1,7 @@ + * replace strip_files with strip_and_check_elf_files which checks for + overlinking (cf http://wiki.mandriva.com/en/Overlinking) and "missing + linking" (need checking if there are too many false positives) + 2008-02-10 Guillaume Rousse <guillomovitch@mandriva.org> 0.28.1 * more perl code clean up * better script name consistency diff --git a/spec-helper.macros.in b/spec-helper.macros.in index 198951a..5e7cf86 100644 --- a/spec-helper.macros.in +++ b/spec-helper.macros.in @@ -5,7 +5,6 @@ %__spec_helper_post \ %{?!dont_clean_files: [ -n "$DONT_CLEANUP" ] || %_spec_helper_dir/clean_files} \ %{?!dont_compress: [ -n "$DONT_COMPRESS" ] || %_spec_helper_dir/compress_files %{?_extension}%{?!_extension:.gz}} \ - %{?!dont_strip: [ -n "$DONT_STRIP" ] || %_spec_helper_dir/strip_files} \ %{?!dont_relink: [ -n "$DONT_RELINK" ] || %_spec_helper_dir/relink_symlinks} \ %{?!dont_cleanup_perl: [ -n "$DONT_CLEAN_PERL" ] || %_spec_helper_dir/clean_perl} \ %{?!dont_symlinks_libs: [ -n "$DONT_SYMLINK_LIBS" ] || %_spec_helper_dir/lib_symlinks} \ @@ -15,5 +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} %_spec_helper_dir/strip_and_check_elf_files \ %nil diff --git a/strip_files b/strip_and_check_elf_files index 2df2a8b..7b9d28a 100755 --- a/strip_files +++ b/strip_and_check_elf_files @@ -12,22 +12,40 @@ die "Invalid build root" unless -d $buildroot; # normalize build root $buildroot =~ s|/$||; -my $exclude_pattern = join('|', - map { '(:?' . quotemeta($_) . ')' } - $ENV{EXCLUDE_FROM_STRIP} ? - split(' ', $ENV{EXCLUDE_FROM_STRIP}) : (), - '/usr/lib/debug' -); -$exclude_pattern = qr/$exclude_pattern/; - my (@shared_libs, @executables, @static_libs); find(\&keep_wanted, $buildroot); -system( - "strip", - "--remove-section=.comment", - "--remove-section=.note", - $_) foreach @shared_libs, @executables; +strip_files() if !$ENV{DONT_STRIP}; +check_missing_or_unused_libs(); + +sub strip_files { + my $exclude_pattern = join('|', + map { '(:?' . quotemeta($_) . ')' } + $ENV{EXCLUDE_FROM_STRIP} ? split(' ', $ENV{EXCLUDE_FROM_STRIP}) : (), + '/usr/lib/debug' + ); + my @to_strip = grep { !/$exclude_pattern/ } @shared_libs, @executables; + + system( + "strip", + "--remove-section=.comment", + "--remove-section=.note", + $_) foreach @to_strip; +} + +sub check_missing_or_unused_libs { + foreach my $f (@shared_libs, @executables) { + my (undef, undef, @l) = `ldd -u -r $f 2>/dev/null`; + @l or next; + my $f_ = substr($f, length($buildroot)); + print STDERR "Warning: unused libraries in $f_: ", join(' ', map { basename($_) } @l), "\n"; + } + foreach my $f (@shared_libs) { + my @l = `ldd -r $f 2>&1 >/dev/null` or next; + my $f_ = substr($f, length($buildroot)); + print STDERR "Warning: undefined symbols in $f_: ", join(' ', map { /undefined symbol: (\S+)/ ? $1 : () } @l), "\n"; + } +} # TODO: we should write a binding for libfile... sub expensive_test { @@ -43,8 +61,6 @@ sub keep_wanted() { return if -l $_; # skip directories return if -d $_; - # skip excluded files - return if $File::Find::name =~ $exclude_pattern; # Does its filename look like a shared library? if (m/\.so/) { @@ -71,3 +87,5 @@ sub keep_wanted() { return; } } + +sub basename { local $_ = shift; s|/*\s*$||; s|.*/||; $_ } |