Blame view

buildroot/buildroot-2016.08.1/support/scripts/check-host-rpath 2.18 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
  #!/usr/bin/env bash
  
  # This script scans $(HOST_DIR)/{bin,sbin} for all ELF files, and checks
  # they have an RPATH to $(HOST_DIR)/usr/lib if they need libraries from
  # there.
  
  # Override the user's locale so we are sure we can parse the output of
  # readelf(1) and file(1)
  export LC_ALL=C
  
  main() {
      local pkg="${1}"
      local hostdir="${2}"
      local file ret
  
      # Remove duplicate and trailing '/' for proper match
      hostdir="$( sed -r -e 's:/+:/:g; s:/$::;' <<<"${hostdir}" )"
  
      ret=0
      while read file; do
          elf_needs_rpath "${file}" "${hostdir}" || continue
          check_elf_has_rpath "${file}" "${hostdir}" && continue
          if [ ${ret} -eq 0 ]; then
              ret=1
              printf "***
  "
              printf "*** ERROR: package %s installs executables without proper RPATH:
  " "${pkg}"
          fi
          printf "***   %s
  " "${file}"
      done < <( find "${hostdir}"/{,usr/}{bin,sbin} -type f -exec file {} + 2>/dev/null \
                |sed -r -e '/^([^:]+):.*\<ELF\>.*\<executable\>.*/!d'                \
                        -e 's//\1/'                                                  \
              )
  
      return ${ret}
  }
  
  elf_needs_rpath() {
      local file="${1}"
      local hostdir="${2}"
      local lib
  
      while read lib; do
          [ -e "${hostdir}/usr/lib/${lib}" ] && return 0
      done < <( readelf -d "${file}"                                         \
                |sed -r -e '/^.* \(NEEDED\) .*Shared library: \[(.+)\]$/!d;' \
                       -e 's//\1/;'                                          \
              )
  
      return 1
  }
  
  check_elf_has_rpath() {
      local file="${1}"
      local hostdir="${2}"
      local rpath dir
  
      while read rpath; do
          for dir in ${rpath//:/ }; do
              # Remove duplicate and trailing '/' for proper match
              dir="$( sed -r -e 's:/+:/:g; s:/$::;' <<<"${dir}" )"
              [ "${dir}" = "${hostdir}/usr/lib" ] && return 0
          done
      done < <( readelf -d "${file}"                                              \
                |sed -r -e '/.* \(R(UN)?PATH\) +Library r(un)?path: \[(.+)\]$/!d' \
                        -e 's//\3/;'                                              \
              )
  
      return 1
  }
  
  main "${@}"