=head1 SYNOPSIS
- dh_strip [debhelper options] [-Xitem]
+B<dh_strip> [S<I<debhelper options>>] [B<-X>I<item>] [--dbg-package=package] [--keep-debug]
=head1 DESCRIPTION
executables, shared libraries, and static libraries that are not used for
debugging.
-It assumes that files that have names like lib*_g.a are static libraries
-used in debugging, and will not strip them.
+This program examines your package build directories and works out what
+to strip on its own. It uses L<file(1)> and file permisions 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
+libraries.) In general it seems to make very good guesses, and will do the
+right thing in almost all cases.
+
+Since it is very hard to automatically guess if a file is a
+module, and hard to determine how to strip a module, dh_strip does not
+currently deal with stripping binary modules such as .o files.
=head1 OPTIONS
stripped. You may use this option multiple times to build up a list of
things to exclude.
+=item B<--dbg-package=>I<package>
+
+This option tells dh_strip that the given package has an associated "-dbg"
+package. dh_strip will, when stripping off the debug symbols of files in
+the given package, save them to independent files in the package build
+directory for the "-dbg" package.
+
+For example, you might have a package libfoo libfoo, and want to include a
+libfoo-dbg package that contains debugging symbols. The command "dh_strip
+--dbg-package=libfoo" will make dh_strip save the debugging symbols for
+usr/lib/libfoo.so.0 into usr/lib/debug/usr/lib/libfoo.so.0 in the package
+build directory for libfoo-dbg. If libfoo-dbg is installed, gdb wil
+automatically load up the debugging symbols from it when debugging libfoo.
+
+This option may be repeated to list more than one package.
+
+=item B<-k>, B<--keep-debug>
+
+Debug symbols will be retained, but split into an independant
+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
exit;
}
+# I could just use `file $_[0]`, but this is safer
+sub get_file_type {
+ my $file=shift;
+ open (FILE, '-|') # handle all filenames safely
+ || exec('file', $file)
+ || die "can't exec file: $!";
+ my $type=<FILE>;
+ close FILE;
+ return $type;
+}
+
# 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:
return if ($fn=~m/\Q$f\E/);
}
+ # Is it a debug library in a debug subdir?
+ return if $fn=~m/debug\/.*\.so/;
+
# Does its filename look like a shared library?
if (m/.*\.so.*?/) {
# Ok, do the expensive test.
- my $type=`file $_`;
+ my $type=get_file_type($_);
if ($type=~m/.*ELF.*shared.*/) {
push @shared_libs, $fn;
return;
my (undef,undef,$mode,undef)=stat(_);
if ($mode & 0111) {
# Ok, expensive test.
- my $type=`file $_`;
- if ($type=~m/.*ELF.*executable.*/) {
+ my $type=get_file_type($_);
+ if ($type=~m/.*ELF.*(executable|shared).*/) {
push @executables, $fn;
return;
}
}
}
+sub make_debug {
+ my $file=shift;
+ my $tmp=shift;
+ my $desttmp=shift;
+
+ my ($base_file)=$file=~/^$tmp(.*)/;
+ 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{KEEP_DEBUG};
+ my $debugtmp=$tmp;
+ 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 $keep_debug;
}
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 $keep_debug
}
foreach (@static_libs) {
=head1 SEE ALSO
-L<debhelper(1)>
+L<debhelper(7)>
This program is a part of debhelper.