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 |