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>] [B<--dbg-package=>I<package>] [B<--keep-debug>]
19 B<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 permissions and filenames
25 to figure out what files are shared libraries (F<*.so>), executable binaries,
26 and static (F<lib*.a>) and debugging libraries (F<lib*_g.a>, F<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, B<dh_strip> does not
33 currently deal with stripping binary modules such as F<.o> files.
39 =item B<-X>I<item>, B<--exclude=>I<item>
41 Exclude files that contain I<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 Causes B<dh_strip> to save debug symbols stripped from the packages it acts on
48 as independent files in the package build directory of the specified debugging
51 For example, if your packages are libfoo and foo and you want to include a
52 I<foo-dbg> package with debugging symbols, use B<dh_strip --dbg-package=>I<foo-dbg>.
54 Note that this option behaves significantly different in debhelper
55 compatibility levels 4 and below. Instead of specifying the name of a debug
56 package to put symbols in, it specifies a package (or packages) which
57 should have separated debug symbols, and the separated symbols are placed
58 in packages with B<-dbg> added to their name.
60 =item B<-k>, B<--keep-debug>
62 Debug symbols will be retained, but split into an independent
63 file in F<usr/lib/debug/> in the package build directory. B<--dbg-package>
64 is easier to use than this option, but this option is more flexible.
70 If the B<DEB_BUILD_OPTIONS> environment variable contains B<nostrip>, nothing
71 will be stripped, in accordance with Debian policy (section 10.1
76 Debian policy, version 3.0.1
81 "keep-debug" => \$dh{K_FLAG},
84 # This variable can be used to turn off stripping (see Policy).
85 if (defined $ENV{DEB_BUILD_OPTIONS} && $ENV{DEB_BUILD_OPTIONS} =~ /nostrip/) {
89 my $objcopy = "objcopy";
92 if (dpkg_architecture_value("DEB_BUILD_GNU_TYPE")
93 ne dpkg_architecture_value("DEB_HOST_GNU_TYPE")) {
94 $objcopy=dpkg_architecture_value("DEB_HOST_GNU_TYPE") . "-objcopy";
95 $strip=dpkg_architecture_value("DEB_HOST_GNU_TYPE") . "-strip";
98 # I could just use `file $_[0]`, but this is safer
101 open (FILE, '-|') # handle all filenames safely
102 || exec('file', $file)
103 || die "can't exec file: $!";
109 # Check if a file is an elf binary, shared library, or static library,
110 # for use by File::Find. It'll fill the following 3 arrays with anything
112 my (@shared_libs, @executables, @static_libs);
114 return if -l $_ or -d $_; # Skip directories and symlinks always.
116 # See if we were asked to exclude this file.
117 # Note that we have to test on the full filename, including directory.
118 my $fn="$File::Find::dir/$_";
119 foreach my $f (@{$dh{EXCLUDE}}) {
120 return if ($fn=~m/\Q$f\E/);
123 # Is it a debug library in a debug subdir?
124 return if $fn=~m/debug\/.*\.so/;
126 # Does its filename look like a shared library?
127 # (*.cmxs are OCaml native code shared libraries)
128 if (m/.*\.(so.*?|cmxs$)/) {
129 # Ok, do the expensive test.
130 my $type=get_file_type($_);
131 if ($type=~m/.*ELF.*shared.*/) {
132 push @shared_libs, $fn;
137 # Is it executable? -x isn't good enough, so we need to use stat.
138 my (undef,undef,$mode,undef)=stat(_);
140 # Ok, expensive test.
141 my $type=get_file_type($_);
142 if ($type=~m/.*ELF.*(executable|shared).*/) {
143 push @executables, $fn;
148 # Is it a static library, and not a debug library?
149 if (m/lib.*\.a$/ && ! m/.*_g\.a$/) {
150 # Is it a binary file, or something else (maybe a liner
151 # script on Hurd, for example? I don't use file, because
152 # file returns a variety of things on static libraries.
154 push @static_libs, $fn;
165 # Don't try to copy debug symbols out if the file is already
167 return unless get_file_type($file) =~ /not stripped/;
169 my ($base_file)=$file=~/^\Q$tmp\E(.*)/;
170 my $debug_path=$desttmp."/usr/lib/debug/".$base_file;
171 my $debug_dir=dirname($debug_path);
172 if (! -d $debug_dir) {
173 doit("install", "-d", $debug_dir);
175 doit($objcopy, "--only-keep-debug", $file, $debug_path);
176 # No reason for this to be executable.
177 doit("chmod", 644, $debug_path);
183 my $debug_path=shift;
184 doit($objcopy, "--add-gnu-debuglink", $debug_path, $file);
187 foreach my $package (@{$dh{DOPACKAGES}}) {
188 my $tmp=tmpdir($package);
190 # Support for keeping the debugging symbols in a detached file.
191 my $keep_debug=$dh{K_FLAG};
194 if (ref $dh{DEBUGPACKAGES}) {
196 # Note that it's only an array for the v4 stuff;
197 # for v5 only one value is used.
198 my $debugpackage=@{$dh{DEBUGPACKAGES}}[0];
199 if (! grep { $_ eq $debugpackage } getpackages()) {
200 error("debug package $debugpackage is not listed in the control file");
202 $debugtmp=tmpdir($debugpackage);
206 if (ref $dh{DEBUGPACKAGES} && grep { $_ eq $package } @{$dh{DEBUGPACKAGES}}) {
208 $debugtmp=tmpdir($package."-dbg");
212 @shared_libs=@executables=@static_libs=();
213 find(\&testfile,$tmp);
215 foreach (@shared_libs) {
216 my $debug_path = make_debug($_, $tmp, $debugtmp) if $keep_debug;
217 # Note that all calls to strip on shared libs
218 # *must* inclde the --strip-unneeded.
219 doit($strip,"--remove-section=.comment",
220 "--remove-section=.note","--strip-unneeded",$_);
221 attach_debug($_, $debug_path) if defined $debug_path;
224 foreach (@executables) {
225 my $debug_path = make_debug($_, $tmp, $debugtmp) if $keep_debug;
226 doit($strip,"--remove-section=.comment",
227 "--remove-section=.note",$_);
228 attach_debug($_, $debug_path) if defined $debug_path;
231 foreach (@static_libs) {
232 doit($strip,"--strip-debug",$_);
240 This program is a part of debhelper.
244 Joey Hess <joeyh@debian.org>