Message ID | 1461358223-18312-11-git-send-email-s.martin49@gmail.com |
---|---|
State | Changes Requested |
Headers | show |
On Fri, Apr 22, 2016 at 10:50 PM, Samuel Martin <s.martin49@gmail.com> wrote: > This option can be useful to figure out patterns in the leaks. > > Signed-off-by: Samuel Martin <s.martin49@gmail.com> > > --- > changes v8->v9: > - update commit log > > changes v7->v8: > - new patch. Move this feature in its own change-set as it seems a bit > controversial. > - make leaks classification optional > --- > support/scripts/check-host-leaks | 59 ++++++++++++++++++++++++++++++++++++++-- > support/scripts/shell/readelf.sh | 1 - > 2 files changed, 57 insertions(+), 3 deletions(-) > > diff --git a/support/scripts/check-host-leaks b/support/scripts/check-host-leaks > index 9f363af..bd92493 100755 > --- a/support/scripts/check-host-leaks > +++ b/support/scripts/check-host-leaks > @@ -45,6 +45,12 @@ Options: > Can be set more than once. > An excluded path must be an absolute canonical path. > > + --classify-leaks > + Enables leak classification. Categories are defined according to > + the matched files' type or ELF kinds. > + For ELF files, the sections containing the leaks will displayed. s/will displayed/will be displayed Reviewed-by: Yegor Yefremov <yegorslists@googlemail.com> > + Enabling this option substantially increases the execution time > + of the script. > > EOF > return ${ret} > @@ -56,9 +62,51 @@ source.load_module log > source.load_module utils > source.load_module sdk > > +classify_leak() { > + local f="${1}" regexp="${2}" > + local leak > + if test -h "${f}" ; then leak="symlink" > + elif readelf.is_elf "${f}" ; then > + if readelf.is_elf_executable "${f}" ; then leak="ELF/exe" > + elif readelf.is_elf_shared_object "${f}" ; then leak="ELF/*.so" > + elif readelf.is_elf_static_library "${f}" ; then leak="ELF/*.a" > + elif readelf.is_elf_object "${f}" ; then > + case "${f}" in > + *.ko) leak="ELF/*.ko" ;; > + *) leak="ELF/*.o" ;; > + esac > + else leak="ELF/?" > + fi > + local section > + local sections=() > + for section in $(readelf.list_sections "${f}") ; do > + if readelf.string_section "${f}" "${section}" | > + grep -qaE "${regexp}" ; then > + if ! utils.list_has ${section} ${sections[@]} ; then > + sections+=( "${section}" ) > + fi > + fi > + done > + leak="${leak} [${sections[*]}]" > + else > + case "${f}" in > + *-config) leak="*-config script" ;; > + *.la) leak="*.la" ;; > + *.pc) leak="*.pc" ;; > + *.py) leak="*.py" ;; > + *.pyc|*.pyo) leak="*.py[co]" ;; > + esac > + fi > + if test -z "${leak}" ; then > + leak="? [$(file -z "${f}" | sed -e 's/.*: //')]" > + fi > + printf "${leak}" > +} > + > + > main() { > local root_dir > - local class_leaks > + local classify_leaks > local excluded=() > local leak_paths=() > while test ${#} -gt 0 ; do > @@ -67,6 +115,8 @@ main() { > ;; > --exclude) shift ; excluded+=( "${1}" ) > ;; > + --classify-leaks) classify_leaks=y > + ;; > -h|--help) > usage > exit 0 > @@ -119,7 +169,12 @@ main() { > grep -raEl "${re_leaks}" . | > sed -re "${re_excl} ; s:^\.:${root_dir}:" | > while read f ; do > - printf "%s\n" "${f}" > + if test -n "${classify_leaks}" ; then > + local leak="$(classify_leak "${f}" "${regexp}")" > + printf "%-70s : %-120s\n" "${leak}" "${f}" > + else > + printf "%s\n" "${f}" > + fi > done | sort > popd >/dev/null > } > diff --git a/support/scripts/shell/readelf.sh b/support/scripts/shell/readelf.sh > index b23666e..a7d790e 100644 > --- a/support/scripts/shell/readelf.sh > +++ b/support/scripts/shell/readelf.sh > @@ -54,7 +54,6 @@ source.declare_module readelf > # environment: > # READELF: readelf program path > readelf._match_elf_regexp() { > - log._trace_func > local regexp="${1}" file="${2}" > LC_ALL=C ${READELF} -h "${file}" 2>/dev/null | grep -qE "${regexp}" > } > -- > 2.8.0 > > _______________________________________________ > buildroot mailing list > buildroot@busybox.net > http://lists.busybox.net/mailman/listinfo/buildroot
diff --git a/support/scripts/check-host-leaks b/support/scripts/check-host-leaks index 9f363af..bd92493 100755 --- a/support/scripts/check-host-leaks +++ b/support/scripts/check-host-leaks @@ -45,6 +45,12 @@ Options: Can be set more than once. An excluded path must be an absolute canonical path. + --classify-leaks + Enables leak classification. Categories are defined according to + the matched files' type or ELF kinds. + For ELF files, the sections containing the leaks will displayed. + Enabling this option substantially increases the execution time + of the script. EOF return ${ret} @@ -56,9 +62,51 @@ source.load_module log source.load_module utils source.load_module sdk +classify_leak() { + local f="${1}" regexp="${2}" + local leak + if test -h "${f}" ; then leak="symlink" + elif readelf.is_elf "${f}" ; then + if readelf.is_elf_executable "${f}" ; then leak="ELF/exe" + elif readelf.is_elf_shared_object "${f}" ; then leak="ELF/*.so" + elif readelf.is_elf_static_library "${f}" ; then leak="ELF/*.a" + elif readelf.is_elf_object "${f}" ; then + case "${f}" in + *.ko) leak="ELF/*.ko" ;; + *) leak="ELF/*.o" ;; + esac + else leak="ELF/?" + fi + local section + local sections=() + for section in $(readelf.list_sections "${f}") ; do + if readelf.string_section "${f}" "${section}" | + grep -qaE "${regexp}" ; then + if ! utils.list_has ${section} ${sections[@]} ; then + sections+=( "${section}" ) + fi + fi + done + leak="${leak} [${sections[*]}]" + else + case "${f}" in + *-config) leak="*-config script" ;; + *.la) leak="*.la" ;; + *.pc) leak="*.pc" ;; + *.py) leak="*.py" ;; + *.pyc|*.pyo) leak="*.py[co]" ;; + esac + fi + if test -z "${leak}" ; then + leak="? [$(file -z "${f}" | sed -e 's/.*: //')]" + fi + printf "${leak}" +} + + main() { local root_dir - local class_leaks + local classify_leaks local excluded=() local leak_paths=() while test ${#} -gt 0 ; do @@ -67,6 +115,8 @@ main() { ;; --exclude) shift ; excluded+=( "${1}" ) ;; + --classify-leaks) classify_leaks=y + ;; -h|--help) usage exit 0 @@ -119,7 +169,12 @@ main() { grep -raEl "${re_leaks}" . | sed -re "${re_excl} ; s:^\.:${root_dir}:" | while read f ; do - printf "%s\n" "${f}" + if test -n "${classify_leaks}" ; then + local leak="$(classify_leak "${f}" "${regexp}")" + printf "%-70s : %-120s\n" "${leak}" "${f}" + else + printf "%s\n" "${f}" + fi done | sort popd >/dev/null } diff --git a/support/scripts/shell/readelf.sh b/support/scripts/shell/readelf.sh index b23666e..a7d790e 100644 --- a/support/scripts/shell/readelf.sh +++ b/support/scripts/shell/readelf.sh @@ -54,7 +54,6 @@ source.declare_module readelf # environment: # READELF: readelf program path readelf._match_elf_regexp() { - log._trace_func local regexp="${1}" file="${2}" LC_ALL=C ${READELF} -h "${file}" 2>/dev/null | grep -qE "${regexp}" }
This option can be useful to figure out patterns in the leaks. Signed-off-by: Samuel Martin <s.martin49@gmail.com> --- changes v8->v9: - update commit log changes v7->v8: - new patch. Move this feature in its own change-set as it seems a bit controversial. - make leaks classification optional --- support/scripts/check-host-leaks | 59 ++++++++++++++++++++++++++++++++++++++-- support/scripts/shell/readelf.sh | 1 - 2 files changed, 57 insertions(+), 3 deletions(-)