Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 24 Jan 2015 09:11:01 +0100
From:      Luigi Rizzo <rizzo@iet.unipi.it>
To:        current@freebsd.org, emaste@freebsd.org
Subject:   elftoolchain version of strip unlinks hard-linked files ?
Message-ID:  <20150124081101.GA74579@onelab2.iet.unipi.it>

next in thread | raw e-mail | index | archive | help
I just found that recent versions of 'strip' on head (the change
occurred between svn 276756 and 277633, not in the code but with
the change from GNU binutils to the elf toolchain) when operating
on hard-linked files, creates a new file instead of modifying the
original:

This is the old  behaviour:
    $ rm a b c; cp some-binary a; ln a b; ln a c; ls -l a b c
    -rwxr-xr-x  3 luigi  wheel  42527 Jan 23 15:57 a
    -rwxr-xr-x  3 luigi  wheel  42527 Jan 23 15:57 b
    -rwxr-xr-x  3 luigi  wheel  42527 Jan 23 15:57 c
    $ ./old-strip a
    $ ls -l a b c
    -rwxr-xr-x  3 luigi  wheel  37000 Jan 23 15:57 a
    -rwxr-xr-x  3 luigi  wheel  37000 Jan 23 15:57 b
    -rwxr-xr-x  3 luigi  wheel  37000 Jan 23 15:57 c
    $ ./old-strip --version
    GNU strip 2.17.50 [FreeBSD] 2007-07-03
    Copyright 2007 Free Software Foundation, Inc.
    This program is free software; you may redistribute it under the terms of
    the GNU General Public License.  This program has absolutely no warranty.


and this is the new one:

    $rm a b c; cp some-binary a; ln a b; ln a c; ls -l a b c
    -rwxr-xr-x  3 luigi  wheel  42527 Jan 23 15:58 a
    -rwxr-xr-x  3 luigi  wheel  42527 Jan 23 15:58 b
    -rwxr-xr-x  3 luigi  wheel  42527 Jan 23 15:58 c
    $ ~/FreeBSD/usr/obj-pico-amd64/usr/home/luigi/FreeBSD/head/tmp/usr/bin/strip a
    $ ls -l a b c
    -rwxr-xr-x  1 luigi  wheel  37000 Jan 23 15:58 a
    -rwxr-xr-x  2 luigi  wheel  42527 Jan 23 15:58 b
    -rwxr-xr-x  2 luigi  wheel  42527 Jan 23 15:58 c
    $ ~/FreeBSD/usr/obj-pico-amd64/usr/home/luigi/FreeBSD/head/tmp/usr/bin/strip --version
    strip (elftoolchain r3136M)

I believe the elftoolchain is doing it wrong and should be fixed.

The GNU version seems to use a function called smart_rename()
(see contrib/binutils/binutils : objcopy.c and rename.c )
that deals with multiple hard links.

(for the records, I found it out because it explodes the /stand
directory generated by crunchgen when i build a picobsd image).

It is also weird that the new strip, despite being statically
linked, looks up for helper programs somewhere, because if i copy
it to a different directory it makes the copy but no longer works
correctly:

    $ cp  ~/FreeBSD/usr/obj-pico-amd64/usr/home/luigi/FreeBSD/head/tmp/usr/bin/strip ./new-strip
    $ file ./new-strip
    ./new-strip: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), statically linked, for FreeBSD 10.1 (1001506), not stripped
    $ rm a b c; cp some-binary a; ln a b; ln a c; ls -l a b c
    -rwxr-xr-x  3 luigi  wheel  42527 Jan 23 16:01 a
    -rwxr-xr-x  3 luigi  wheel  42527 Jan 23 16:01 b
    -rwxr-xr-x  3 luigi  wheel  42527 Jan 23 16:01 c
    $ ./new-strip a
    $ ls -l a b c
    -rwxr-xr-x  1 luigi  wheel  42527 Jan 23 16:02 a
    -rwxr-xr-x  2 luigi  wheel  42527 Jan 23 16:01 b
    -rwxr-xr-x  2 luigi  wheel  42527 Jan 23 16:01 c

Note how this time the file has been unlinked and recreated,
but not stripped.
There is no mention of dependencies in the manpage
head/contrib/elftoolchain/elfcopy/strip.1
and since the file is statically linked i find the
behaviour very surprising.

	cheers
	luigi



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20150124081101.GA74579>