diff options
author | P. J. McDermott <pj@pehjota.net> | 2019-03-21 23:31:02 (EDT) |
---|---|---|
committer | P. J. McDermott <pj@pehjota.net> | 2019-03-22 11:42:07 (EDT) |
commit | 5d536f76fadb0dfb5643f177a0fdb8ec13fdaad3 (patch) | |
tree | 0d92d9729e6019e53a10662280953aa1c0b5b2f7 /src/oh-shlibdeps.sh | |
parent | 67e43afdaa931250b2628a465bae116f20346550 (diff) |
oh-shlibdeps: New utility
Diffstat (limited to 'src/oh-shlibdeps.sh')
-rw-r--r-- | src/oh-shlibdeps.sh | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/oh-shlibdeps.sh b/src/oh-shlibdeps.sh new file mode 100644 index 0000000..cf5473e --- /dev/null +++ b/src/oh-shlibdeps.sh @@ -0,0 +1,79 @@ +#!@SH@ +# +# opkhelper +# src/oh-shlibdeps.sh +# Find shared library dependencies. +# +# Copyright (C) 2019 Patrick "P. J." McDermott +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +. '@pkgdatadir@/load.sm' + +find_needed() +{ + local elf="${1}" + shift 1 + + while IFS='' read -r lib; do + pkg="$('@OPKG@' search "${lib}" | sed 's/ - .*$//')" + if [ -z "${pkg}" ]; then + oh_warn "$(oh_msg 'shlib_no_pkg')" "${lib}" + else + printf '%s,\n' "${pkg}" + fi + done <<-EOF + $('@LDD@' "${elf}" | sed -n 's/^\t.* => \(.*\) (.*)$/\1/p' \ + 2>/dev/null) + EOF + # The above ldd's stderr is redirected to /dev/null to hide glibc ldd's + # "you do not have execution permission" warning. +} + +find_elves() +{ + local d="${1}" + shift 1 + local file= + + while IFS='' read -r file; do + if file "${file}" | grep -E 'ELF.*(executable|shared)' \ + >/dev/null 2>&1; then + find_needed "${file}" + fi + done <<-EOF + $(find "${d}" -type f -a ! -path '*/debug/*' \ + -a \( -name '*.so*' -o -perm '-a+x' \)) + EOF + + return 0 +} + +main() +{ + local d= + + oh_init + + for d in *.data/; do + exec 3>"${d%.data/}.substvars" + printf 'Shlib-Depends:' >&3 + printf ' %s' $(find_elves "${d}" | sort -u) >&3 + exec 3>&- + done + + return 0 +} + +main "${@}" |