summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
authorJoshua Watt <jpewhacker@gmail.com>2018-04-10 21:21:56 -0500
committerRichard Purdie <richard.purdie@linuxfoundation.org>2018-04-13 16:58:07 +0100
commitf8ba27d1355535dd9f8835ce8eb68b4032dfe95f (patch)
tree0a1bb2265570546baed69c50c2ae1b1527891fe4 /meta
parentbeb38c111735ff710a9cd3b00ce06548600d0d8b (diff)
downloadpoky-f8ba27d1355535dd9f8835ce8eb68b4032dfe95f.tar.gz
icecc-create-env: Fix library interpreter usage
Shared libraries sometimes (frequently?) don't have a program interpreter specified. The previous code would fail to find the library dependencies in these cases because no interpreter could be found. Commonly, this meant that if a library depends on another library, it might not be included toolchain because dependency scanning stops with the first one. Instead, capture the program interpreter from the program or library that starts the dependency chain and use that interpreter to get all of the dependencies in the chain, recursively. Additionally, if no interpreter can be found, fallback to using ldd (From OE-Core rev: 4f55e61e9e3dd921bd71a127580dc5fc71d7b339) Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rwxr-xr-xmeta/recipes-devtools/icecc-create-env/icecc-create-env/icecc-create-env112
1 files changed, 77 insertions, 35 deletions
diff --git a/meta/recipes-devtools/icecc-create-env/icecc-create-env/icecc-create-env b/meta/recipes-devtools/icecc-create-env/icecc-create-env/icecc-create-env
index 3015f4e215..b88c53a424 100755
--- a/meta/recipes-devtools/icecc-create-env/icecc-create-env/icecc-create-env
+++ b/meta/recipes-devtools/icecc-create-env/icecc-create-env/icecc-create-env
@@ -99,48 +99,90 @@ normalize_path ()
99 echo $path 99 echo $path
100} 100}
101 101
102add_file () 102add_file_common()
103{
104 local p="$1"
105 local path="$2"
106 local alias="$3"
107
108 add_alias "$path" "$p"
109 if test -n "$alias"; then
110 add_alias "$path" "$alias"
111 fi
112
113 add_path "$path" || return 1
114 print_debug "Adding file '$path'"
115
116 return 0
117}
118
119add_deps()
120{
121 local path="$1"
122 local interp="$2"
123
124 if test -n "$interp" && test -x "$interp"; then
125 # Use the dynamic loaders --list argument to list the
126 # dependencies. The program may have a different program
127 # interpreter (typical when using uninative tarballs), which is
128 # why we can't just call ldd.
129 deps="`$interp --list "$path"`"
130 else
131 deps="`ldd "$path"`"
132 fi
133
134 print_debug "Dependencies are:"
135 print_debug "$deps"
136 if test -n "$deps"; then
137 for lib in $deps; do
138 # ldd now outputs ld as /lib/ld-linux.so.xx on current nptl
139 # based glibc this regexp parse the outputs like:
140 # ldd /usr/bin/gcc
141 # linux-gate.so.1 => (0xffffe000)
142 # libc.so.6 => /lib/tls/libc.so.6 (0xb7e81000)
143 # /lib/ld-linux.so.2 (0xb7fe8000)
144 # covering both situations ( with => and without )
145 lib="`echo "$lib" | sed -n 's,^[^/]*\(/[^ ]*\).*,\1,p'`"
146
147 test -f "$lib" || continue
148 # Check whether the same library also exists in the parent
149 # directory, and prefer that on the assumption that it is a
150 # more generic one.
151 local baselib=`echo "$lib" | sed 's,\(/[^/]*\)/.*\(/[^/]*\)$,\1\2,'`
152 test -f "$baselib" && lib=$baselib
153 add_dependency "$lib" "$interp"
154 done
155 fi
156}
157
158add_dependency()
103{ 159{
104 local p=`normalize_path $1` 160 local p=`normalize_path $1`
105 # readlink is required for Yocto, so we can use it 161 # readlink is required for Yocto, so we can use it
106 local path=`readlink -f "$p"` 162 local path=`readlink -f "$p"`
163 local interp="$2"
107 164
108 add_alias "$path" "$p" 165 add_file_common "$p" "$path" || return
109 if test -n "$2"; then 166
110 add_alias "$path" "$2" 167 if test -x "$path" && is_dynamic_elf "$path"; then
168 add_deps "$path" "$interp"
111 fi 169 fi
170}
112 171
113 add_path "$path" || return 172add_file ()
114 173{
115 if test -x "$path"; then 174 local p=`normalize_path $1`
116 # Only call ldd when it makes sense 175 # readlink is required for Yocto, so we can use it
117 if is_dynamic_elf "$path"; then 176 local path=`readlink -f "$p"`
118 # Request the program interpeter (dynamic loader) 177
119 interp=`readelf -w -l "$path" | grep "Requesting program interpreter:" | sed "s/\s*\[Requesting program interpreter:\s*\(.*\)\]/\1/g"` 178 add_file_common "$p" "$path" "$2" || return
120 179
121 if test -n "$interp" && test -x "$interp"; then 180 if test -x "$path" && is_dynamic_elf "$path"; then
122 # Use the dynamic loaders --list argument to list the 181 # Request the program interpeter (dynamic loader)
123 # depenencies. The program may have a a different program 182 interp=`readelf -W -l "$path" | grep "Requesting program interpreter:" | sed "s/\s*\[Requesting program interpreter:\s*\(.*\)\]/\1/g"`
124 # interpeter (typical when using uninative tarballs), which is 183 print_debug "Interpreter is '$interp'"
125 # why we can't just call ldd. 184
126 # 185 add_deps "$path" "$interp"
127 # ldd now outputs ld as /lib/ld-linux.so.xx on current nptl based glibc
128 # this regexp parse the outputs like:
129 # ldd /usr/bin/gcc
130 # linux-gate.so.1 => (0xffffe000)
131 # libc.so.6 => /lib/tls/libc.so.6 (0xb7e81000)
132 # /lib/ld-linux.so.2 (0xb7fe8000)
133 # covering both situations ( with => and without )
134 for lib in `$interp --list "$path" | sed -n 's,^[^/]*\(/[^ ]*\).*,\1,p'`; do
135 test -f "$lib" || continue
136 # Check wether the same library also exists in the parent directory,
137 # and prefer that on the assumption that it is a more generic one.
138 local baselib=`echo "$lib" | sed 's,\(/[^/]*\)/.*\(/[^/]*\)$,\1\2,'`
139 test -f "$baselib" && lib=$baselib
140 add_file "$lib"
141 done
142 fi
143 fi
144 fi 186 fi
145} 187}
146 188