From: "Mike Frysinger" <vapier@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/pax-utils:master commit in: /, tests/lddtree/
Date: Mon, 20 Jul 2015 04:15:17 +0000 (UTC) [thread overview]
Message-ID: <1437365002.26ee546756ce9e1bb84951bc5cfac3cdde87a2d1.vapier@gentoo> (raw)
commit: 26ee546756ce9e1bb84951bc5cfac3cdde87a2d1
Author: Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Mon Jul 20 04:03:22 2015 +0000
Commit: Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Mon Jul 20 04:03:22 2015 +0000
URL: https://gitweb.gentoo.org/proj/pax-utils.git/commit/?id=26ee5467
lddtree: handle direct ldso linkage better
If the ELF we're showing is linked directly against the ELF which is used
as the ELF interp (i.e. the ldso), make sure we don't list it twice.
We want to see it "twice" in the pretty form:
$ ./lddtree.py /bin/bash
/bin/bash (interpreter => /lib/ld-linux-armhf.so.3) <= here
libreadline.so.6 => /lib/libreadline.so.6
libncurses.so.5 => /lib/libncurses.so.5
libc.so.6 => /lib/libc.so.6
ld-linux-armhf.so.3 => /lib/ld-linux-armhf.so.3 <= here
But not in the list form (as that is used by scripts):
$ ./lddtree.py -l /bin/bash
/bin/bash
/lib/ld-linux-armhf.so.3 <= only here
/lib/libreadline.so.6
/lib/libncurses.so.5
/lib/libc.so.6
We also reconcile a few differences wrt interp display and the sh/py
implementations.
Reported-by: Tomasz Buchert <tomasz <AT> debian.org>
lddtree.py | 13 +++++++++++--
lddtree.sh | 11 +++++++++--
tests/lddtree/dotest.cmp | 10 ++++++++++
3 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/lddtree.py b/lddtree.py
index 645cfd1..9330295 100755
--- a/lddtree.py
+++ b/lddtree.py
@@ -510,17 +510,26 @@ def _ActionShow(options, elf):
chain_libs.pop()
shown_libs = set(elf['needed'])
+ new_libs = elf['needed'][:]
chain_libs = []
interp = elf['interp']
if interp:
- shown_libs.add(os.path.basename(interp))
+ lib = os.path.basename(interp)
+ shown_libs.add(lib)
+ # If we are in non-list mode, then we want to show the "duplicate" interp
+ # lines -- first the header (interp=>xxx), and then the DT_NEEDED line to
+ # show that the ELF is directly linked against the interp.
+ # If we're in list mode though, we only want to show the interp once.
+ # Unless of course we have the --all flag active, then we show everything.
+ if not options.all and options.list and lib in new_libs:
+ new_libs.remove(lib)
if options.list:
print(elf['path'])
if not interp is None:
print(interp)
else:
print('%s (interpreter => %s)' % (elf['path'], interp))
- for lib in elf['needed']:
+ for lib in new_libs:
_show(lib, 1)
diff --git a/lddtree.sh b/lddtree.sh
index a37d499..07be7ab 100755
--- a/lddtree.sh
+++ b/lddtree.sh
@@ -160,6 +160,11 @@ show_elf() {
)
fi
interp=${interp##*/}
+ # If we are in non-list mode, then we want to show the "duplicate" interp
+ # lines -- first the header (interp=>xxx), and then the DT_NEEDED line to
+ # show that the ELF is directly linked against the interp.
+ # If we're in list mode though, we only want to show the interp once.
+ ${LIST} && allhits+=",${interp}"
fi
${LIST} || printf "\n"
@@ -170,12 +175,14 @@ show_elf() {
local my_allhits
if ! ${SHOW_ALL} ; then
my_allhits="${allhits}"
- allhits="${allhits},${interp},${libs}"
+ allhits+=",${libs}"
fi
for lib in ${libs//,/ } ; do
lib=${lib##*/}
- [[ ,${my_allhits}, == *,${lib},* ]] && continue
+ # No need for leading comma w/my_allhits as we guarantee it always
+ # starts with one due to the way we append the value above.
+ [[ ${my_allhits}, == *,${lib},* ]] && continue
find_elf "${lib}" "${resolved}"
rlib=${_find_elf}
show_elf "${rlib:-${lib}}" $((indent + 4)) "${parent_elfs}"
diff --git a/tests/lddtree/dotest.cmp b/tests/lddtree/dotest.cmp
index d8992f3..2f04a55 100755
--- a/tests/lddtree/dotest.cmp
+++ b/tests/lddtree/dotest.cmp
@@ -13,5 +13,15 @@ testit lddtree.*.list
rm -f lddtree.*.list
+#
+# Same as above but with the -a flag
+#
+for sfx in py sh ; do
+ lddtree.${sfx} -l -a /bin/bash > lddtree.${sfx}.list-all &
+done
+wait
+testit lddtree.*.list-all
+rm -f lddtree.*.list-all
+
exit ${ret}
reply other threads:[~2015-07-20 4:15 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1437365002.26ee546756ce9e1bb84951bc5cfac3cdde87a2d1.vapier@gentoo \
--to=vapier@gentoo.org \
--cc=gentoo-commits@lists.gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox