X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=dh_strip;h=2c667bb74bbc9a93e6cfd03ea5ddc597b3254405;hb=64cd63ff797a52da5222024a966d6fdb495af6b5;hp=14f098ed85c31fbad4604bf0915756aecec9a1b2;hpb=3aa6fbb20465d16cf23e1607b078ed3cedf95ebe;p=debhelper.git diff --git a/dh_strip b/dh_strip index 14f098e..2c667bb 100755 --- a/dh_strip +++ b/dh_strip @@ -12,7 +12,7 @@ use Debian::Debhelper::Dh_Lib; =head1 SYNOPSIS -B [S>] [B<-X>I] +B [S>] [B<-X>I] [--dbg-package=package] [--keep-debug] =head1 DESCRIPTION @@ -21,7 +21,7 @@ executables, shared libraries, and static libraries that are not used for debugging. This program examines your package build directories and works out what -to strip on its own. It uses L and file permisions and filenames +to strip on its own. It uses L and file permissions and filenames to figure out what files are shared libraries (*.so), executable binaries, and static (lib*.a) and debugging libraries (lib*_g.a, debug/*.so), and strips each as much as is possible. (Which is not at all for debugging @@ -42,12 +42,34 @@ Exclude files that contain "item" anywhere in their filename from being stripped. You may use this option multiple times to build up a list of things to exclude. +=item B<--dbg-package=>I + +Causes dh_strip to save debug symbols stripped from the packages it acts on +as independent files in the package build directory of the specified debugging +package. + +For example, if your packages are libfoo and foo and you want to include a +foo-dbg package with debugging symbols, use dh_strip --dbg-package=foo-dbg. + +Note that this option behaves significantly different in debhelper +compatibility levels 4 and below. Instead of specifying the name of a debug +package to put symbols in, it specifies a package (or packages) which +should have separated debug symbols, and the separated symbols are placed +in packages with "-dbg" added to their name. + +=item B<-k>, B<--keep-debug> + +Debug symbols will be retained, but split into an independent +file in usr/lib/debug/ in the package build directory. --dbg-package +is easier to use than this option, but this option is more flexible. + =back =head1 NOTES If the DEB_BUILD_OPTIONS environment variable contains "nostrip", nothing -will be stripped, in accordance with Debian policy. +will be stripped, in accordance with Debian policy (section 10.1 +"Binaries"). =head1 CONFORMS TO @@ -55,7 +77,9 @@ Debian policy, version 3.0.1 =cut -init(); +init(options => { + "keep-debug" => \$dh{K_FLAG}, +}); # This variable can be used to turn off stripping (see Policy). if (defined $ENV{DEB_BUILD_OPTIONS} && $ENV{DEB_BUILD_OPTIONS} =~ /nostrip/) { @@ -79,7 +103,7 @@ sub get_file_type { my (@shared_libs, @executables, @static_libs); sub testfile { return if -l $_ or -d $_; # Skip directories and symlinks always. - + # See if we were asked to exclude this file. # Note that we have to test on the full filename, including directory. my $fn="$File::Find::dir/$_"; @@ -113,26 +137,85 @@ sub testfile { # Is it a static library, and not a debug library? if (m/lib.*\.a$/ && ! m/.*_g\.a$/) { - push @static_libs, $fn; - return; + # Is it a binary file, or something else (maybe a liner + # script on Hurd, for example? I don't use file, because + # file returns a varity of things on static libraries. + if (-B $_) { + push @static_libs, $fn; + return; + } } } +sub make_debug { + my $file=shift; + my $tmp=shift; + my $desttmp=shift; + + # Don't try to copy debug symbols out if the file is already + # stripped. + return unless get_file_type($file) =~ /not stripped/; + + my ($base_file)=$file=~/^\Q$tmp\E(.*)/; + my $debug_path=$desttmp."/usr/lib/debug/".$base_file; + my $debug_dir=dirname($debug_path); + if (! -d $debug_dir) { + doit("install", "-d", $debug_dir); + } + doit("objcopy", "--only-keep-debug", $file, $debug_path); + # No reason for this to be executable. + doit("chmod", 644, $debug_path); + return $debug_path; +} + +sub attach_debug { + my $file=shift; + my $debug_path=shift; + doit("objcopy", "--add-gnu-debuglink", $debug_path, $file); +} + foreach my $package (@{$dh{DOPACKAGES}}) { my $tmp=tmpdir($package); + # Support for keeping the debugging symbols in a detached file. + my $keep_debug=$dh{K_FLAG}; + my $debugtmp=$tmp; + if (! compat(4)) { + if (ref $dh{DEBUGPACKAGES}) { + $keep_debug=1; + # Note that it's only an array for the v4 stuff; + # for v5 only one value is used. + my $debugpackage=@{$dh{DEBUGPACKAGES}}[0]; + if (! grep { $_ eq $debugpackage } getpackages()) { + error("debug package $debugpackage is not listed in the control file"); + } + $debugtmp=tmpdir($debugpackage); + } + } + else { + if (ref $dh{DEBUGPACKAGES} && grep { $_ eq $package } @{$dh{DEBUGPACKAGES}}) { + $keep_debug=1; + $debugtmp=tmpdir($package."-dbg"); + } + } + + @shared_libs=@executables=@static_libs=(); find(\&testfile,$tmp); foreach (@shared_libs) { + my $debug_path = make_debug($_, $tmp, $debugtmp) if $keep_debug; # Note that all calls to strip on shared libs # *must* inclde the --strip-unneeded. doit("strip","--remove-section=.comment", "--remove-section=.note","--strip-unneeded",$_); + attach_debug($_, $debug_path) if defined $debug_path; } foreach (@executables) { + my $debug_path = make_debug($_, $tmp, $debugtmp) if $keep_debug; doit("strip","--remove-section=.comment", "--remove-section=.note",$_); + attach_debug($_, $debug_path) if defined $debug_path; } foreach (@static_libs) {