5 dh_strip - strip executables, shared libraries, and some static libraries
11 use Debian::Debhelper::Dh_Lib;
15 B<dh_strip> [S<I<debhelper options>>] [B<-X>I<item>] [--dbg-package=package] [--keep-debug]
19 dh_strip is a debhelper program that is responsible for stripping
20 executables, shared libraries, and static libraries that are not used for
23 This program examines your package build directories and works out what
24 to strip on its own. It uses L<file(1)> and file permisions and filenames
25 to figure out what files are shared libraries (*.so), executable binaries,
26 and static (lib*.a) and debugging libraries (lib*_g.a, debug/*.so), and
27 strips each as much as is possible. (Which is not at all for debugging
28 libraries.) In general it seems to make very good guesses, and will do the
29 right thing in almost all cases.
31 Since it is very hard to automatically guess if a file is a
32 module, and hard to determine how to strip a module, dh_strip does not
33 currently deal with stripping binary modules such as .o files.
39 =item B<-X>I<item>, B<--exclude=>I<item>
41 Exclude files that contain "item" anywhere in their filename from being
42 stripped. You may use this option multiple times to build up a list of
45 =item B<--dbg-package=>I<package>
47 This option tells dh_strip that the given package has an associated "-dbg"
48 package. dh_strip will, when stripping off the debug symbols of files in
49 the given package, save them to independent files in the package build
50 directory for the "-dbg" package.
52 For example, you might have a package named libfoo, and want to include a
53 libfoo-dbg package that contains debugging symbols. The command "dh_strip
54 --dbg-package=libfoo" will make dh_strip save the debugging symbols for
55 usr/lib/libfoo.so.0 into usr/lib/debug/usr/lib/libfoo.so.0 in the package
56 build directory for libfoo-dbg. If libfoo-dbg is installed, gdb will
57 automatically load up the debugging symbols from it when debugging libfoo.
59 This option may be repeated to list more than one package.
61 Note that if you use this option, your package should build-depend on
62 binutils (>= 2.14.90.0.7).
64 =item B<-k>, B<--keep-debug>
66 Debug symbols will be retained, but split into an independant
67 file in usr/lib/debug/ in the package build directory. --dbg-package
68 is easier to use than this option, but this option is more flexible.
70 Note that if you use this option, your package should build-depend on
71 binutils (>= 2.12.90.0.9).
77 If the DEB_BUILD_OPTIONS environment variable contains "nostrip", nothing
78 will be stripped, in accordance with Debian policy.
82 Debian policy, version 3.0.1
88 # This variable can be used to turn off stripping (see Policy).
89 if (defined $ENV{DEB_BUILD_OPTIONS} && $ENV{DEB_BUILD_OPTIONS} =~ /nostrip/) {
93 # I could just use `file $_[0]`, but this is safer
96 open (FILE, '-|') # handle all filenames safely
97 || exec('file', $file)
98 || die "can't exec file: $!";
104 # Check if a file is an elf binary, shared library, or static library,
105 # for use by File::Find. It'll fill the following 3 arrays with anything
107 my (@shared_libs, @executables, @static_libs);
109 return if -l $_ or -d $_; # Skip directories and symlinks always.
111 # See if we were asked to exclude this file.
112 # Note that we have to test on the full filename, including directory.
113 my $fn="$File::Find::dir/$_";
114 foreach my $f (@{$dh{EXCLUDE}}) {
115 return if ($fn=~m/\Q$f\E/);
118 # Is it a debug library in a debug subdir?
119 return if $fn=~m/debug\/.*\.so/;
121 # Does its filename look like a shared library?
123 # Ok, do the expensive test.
124 my $type=get_file_type($_);
125 if ($type=~m/.*ELF.*shared.*/) {
126 push @shared_libs, $fn;
131 # Is it executable? -x isn't good enough, so we need to use stat.
132 my (undef,undef,$mode,undef)=stat(_);
134 # Ok, expensive test.
135 my $type=get_file_type($_);
136 if ($type=~m/.*ELF.*(executable|shared).*/) {
137 push @executables, $fn;
142 # Is it a static library, and not a debug library?
143 if (m/lib.*\.a$/ && ! m/.*_g\.a$/) {
144 # Is it a binary file, or something else (maybe a liner
145 # script on Hurd, for example? I don't use file, because
146 # file returns a varity of things on static libraries.
148 push @static_libs, $fn;
159 my ($base_file)=$file=~/^\Q$tmp\E(.*)/;
160 my $debug_path=$desttmp."/usr/lib/debug/".$base_file;
161 my $debug_dir=dirname($debug_path);
162 if (! -d $debug_dir) {
163 doit("install", "-d", $debug_dir);
165 doit("objcopy", "--only-keep-debug", $file, $debug_path);
166 # No reason for this to be executable.
167 doit("chmod", 644, $debug_path);
173 my $debug_path=shift;
174 doit("objcopy", "--add-gnu-debuglink", $debug_path, $file);
177 foreach my $package (@{$dh{DOPACKAGES}}) {
178 my $tmp=tmpdir($package);
180 # Support for keeping the debugging symbols in a detached file.
181 my $keep_debug=$dh{KEEP_DEBUG};
183 if (ref $dh{DEBUGPACKAGES} && grep { $_ eq $package } @{$dh{DEBUGPACKAGES}}) {
185 $debugtmp=tmpdir($package."-dbg");
188 @shared_libs=@executables=@static_libs=();
189 find(\&testfile,$tmp);
191 foreach (@shared_libs) {
192 my $debug_path = make_debug($_, $tmp, $debugtmp) if $keep_debug;
193 # Note that all calls to strip on shared libs
194 # *must* inclde the --strip-unneeded.
195 doit("strip","--remove-section=.comment",
196 "--remove-section=.note","--strip-unneeded",$_);
197 attach_debug($_, $debug_path) if $keep_debug;
200 foreach (@executables) {
201 my $debug_path = make_debug($_, $tmp, $debugtmp) if $keep_debug;
202 doit("strip","--remove-section=.comment",
203 "--remove-section=.note",$_);
204 attach_debug($_, $debug_path) if $keep_debug
207 foreach (@static_libs) {
208 doit("strip","--strip-debug",$_);
216 This program is a part of debhelper.
220 Joey Hess <joeyh@debian.org>