aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS4
-rw-r--r--spec-helper.macros.in2
-rwxr-xr-xstrip_and_check_elf_files (renamed from strip_files)48
3 files changed, 38 insertions, 16 deletions
diff --git a/NEWS b/NEWS
index e9cde86..f06da36 100644
--- a/NEWS
+++ b/NEWS
@@ -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|.*/||; $_ }