Gentoo Archives: gentoo-commits

From: "Mike Frysinger (vapier)" <vapier@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] gentoo-projects commit in pax-utils: lddtree.sh
Date: Sat, 03 Nov 2012 00:06:28
Message-Id: 20121103000610.6F5E420E47@flycatcher.gentoo.org
1 vapier 12/11/03 00:06:10
2
3 Modified: lddtree.sh
4 Log:
5 lddtree: check for correct abi types before showing a match #364079 by Marc-Antoine Perennou
6
7 Revision Changes Path
8 1.11 pax-utils/lddtree.sh
9
10 file : http://sources.gentoo.org/viewvc.cgi/gentoo-projects/pax-utils/lddtree.sh?rev=1.11&view=markup
11 plain: http://sources.gentoo.org/viewvc.cgi/gentoo-projects/pax-utils/lddtree.sh?rev=1.11&content-type=text/plain
12 diff : http://sources.gentoo.org/viewvc.cgi/gentoo-projects/pax-utils/lddtree.sh?r1=1.10&r2=1.11
13
14 Index: lddtree.sh
15 ===================================================================
16 RCS file: /var/cvsroot/gentoo-projects/pax-utils/lddtree.sh,v
17 retrieving revision 1.10
18 retrieving revision 1.11
19 diff -u -r1.10 -r1.11
20 --- lddtree.sh 23 Mar 2011 02:23:34 -0000 1.10
21 +++ lddtree.sh 3 Nov 2012 00:06:10 -0000 1.11
22 @@ -1,5 +1,5 @@
23 #!/bin/bash
24 -# $Header: /var/cvsroot/gentoo-projects/pax-utils/lddtree.sh,v 1.10 2011/03/23 02:23:34 vapier Exp $
25 +# $Header: /var/cvsroot/gentoo-projects/pax-utils/lddtree.sh,v 1.11 2012/11/03 00:06:10 vapier Exp $
26
27 argv0=${0##*/}
28
29 @@ -23,22 +23,30 @@
30 return 1
31 }
32
33 -unset c_last_needed_by
34 -unset c_ldso_paths
35 +elf_specs() {
36 + scanelf -BF '#F%a %M %D %I' "$1"
37 +}
38 +
39 +lib_paths_fallback="/lib* /usr/lib* /usr/local/lib*"
40 +c_ldso_paths_loaded='false'
41 find_elf() {
42 + _find_elf=''
43 +
44 local elf=$1 needed_by=$2
45 if [[ ${elf} == */* ]] && [[ -e ${elf} ]] ; then
46 - echo "${elf}"
47 + _find_elf=${elf}
48 return 0
49 else
50 check_paths() {
51 local elf=$1 ; shift
52 - local path
53 - for path in "$@" ; do
54 - # XXX: This lacks ELF EM/EI_CLASS/EI_DATA/... checking (multilib)
55 - if [[ -e ${path}/${elf} ]] ; then
56 - echo "${path}/${elf}"
57 - return 0
58 + local path pe
59 + for path ; do
60 + pe="${path%/}/${elf#/}"
61 + if [[ -e ${pe} ]] ; then
62 + if [[ $(elf_specs "${pe}") == "${elf_specs}" ]] ; then
63 + _find_elf=${pe}
64 + return 0
65 + fi
66 fi
67 done
68 return 1
69 @@ -62,11 +70,13 @@
70 done
71 fi
72
73 - if [[ -z ${c_ldso_paths} ]] ; then
74 + if ! ${c_ldso_paths_loaded} ; then
75 + c_ldso_paths_loaded='true'
76 + c_ldso_paths=()
77 if [[ -r /etc/ld.so.conf ]] ; then
78 read_ldso_conf() {
79 local line p
80 - for p in "$@" ; do
81 + for p ; do
82 # if the glob didnt match anything #360041,
83 # or the files arent readable, skip it
84 [[ -r ${p} ]] || continue
85 @@ -74,7 +84,7 @@
86 case ${line} in
87 "#"*) ;;
88 "include "*) read_ldso_conf ${line#* } ;;
89 - *) c_ldso_paths="${c_ldso_paths} ${line}" ;;
90 + *) c_ldso_paths+=( "${line}" ) ;;
91 esac
92 done <"${p}"
93 done
94 @@ -84,13 +94,12 @@
95 read_ldso_conf /etc/ld.so.conf
96 popd >/dev/null
97 fi
98 - : ${c_ldso_paths:= }
99 fi
100 - if [[ ${c_ldso_paths} != " " ]] ; then
101 - check_paths "${elf}" ${c_ldso_paths} && return 0
102 + if [[ ${#c_ldso_paths[@]} -gt 0 ]] ; then
103 + check_paths "${elf}" "${c_ldso_paths[@]}" && return 0
104 fi
105
106 - check_paths "${elf}" /lib* /usr/lib* /usr/local/lib* && return 0
107 + check_paths "${elf}" ${lib_paths_ldso:-${lib_paths_fallback}} && return 0
108 fi
109 return 1
110 }
111 @@ -98,7 +107,9 @@
112 show_elf() {
113 local elf=$1 indent=$2 parent_elfs=$3
114 local rlib lib libs
115 - local interp resolved=$(find_elf "${elf}")
116 + local interp resolved
117 + find_elf "${elf}"
118 + resolved=${_find_elf}
119 elf=${elf##*/}
120
121 printf "%${indent}s%s => " "" "${elf}"
122 @@ -109,8 +120,15 @@
123 parent_elfs="${parent_elfs},${elf}"
124 printf "${resolved:-not found}"
125 if [[ ${indent} -eq 0 ]] ; then
126 + elf_specs=$(elf_specs "${resolved}")
127 interp=$(scanelf -qF '#F%i' "${resolved}")
128 +
129 printf " (interpreter => ${interp:-none})"
130 + if [[ -r ${interp} ]] ; then
131 + # Extract the default lib paths out of the ldso.
132 + lib_paths_ldso=$(strings "${interp}" | grep '^/.*lib')
133 + lib_paths_ldso=${lib_paths_ldso//:/ }
134 + fi
135 interp=${interp##*/}
136 fi
137 printf "\n"
138 @@ -128,7 +146,8 @@
139 for lib in ${libs//,/ } ; do
140 lib=${lib##*/}
141 [[ ,${my_allhits}, == *,${lib},* ]] && continue
142 - rlib=$(find_elf "${lib}" "${resolved}")
143 + find_elf "${lib}" "${resolved}"
144 + rlib=${_find_elf}
145 show_elf "${rlib:-${lib}}" $((indent + 4)) "${parent_elfs}"
146 done
147 }
148 @@ -153,7 +172,9 @@
149 ${SET_X} && set -x
150
151 ret=0
152 -for elf in "$@" ; do
153 +for elf ; do
154 + unset lib_paths_ldso
155 + unset c_last_needed_by
156 if [[ ! -e ${elf} ]] ; then
157 error "${elf}: file does not exist"
158 elif [[ ! -r ${elf} ]] ; then