commit: 14f2062ff0ce73d0118f960bad8e15425b73e538
Author: Paul Varner <fuzzyray <AT> gentoo <DOT> org>
AuthorDate: Tue Nov 11 16:31:33 2014 +0000
Commit: Paul Varner <fuzzyray <AT> gentoo <DOT> org>
CommitDate: Tue Nov 11 16:31:33 2014 +0000
URL:
http://sources.gentoo.org/gitweb/?p=proj/gentoolkit.git;a=commit;h=14f2062f
revdep-rebuild.sh: Look for issues with symbols. (Bug 63643)
These changes cause revdep-rebuild.sh to unconditionally look for
"Symbol not defined" in ldd -d -r ouput. Additionally, it adds the
options -u, --search-symbols to look for "undefined symbol". Using this
option will cause false positives in the revdep-rebuild output.
---
bin/revdep-rebuild.sh | 38 ++++++++++++++++++++++++++++++++++++--
man/revdep-rebuild.1 | 3 +++
2 files changed, 39 insertions(+), 2 deletions(-)
diff --git a/bin/revdep-rebuild.sh b/bin/revdep-rebuild.sh
index 01a0454..633701e 100755
--- a/bin/revdep-rebuild.sh
+++ b/bin/revdep-rebuild.sh
@@ -54,6 +54,7 @@ declare ORDER_PKGS # ...sort the atoms in deep
dependency order
declare PACKAGE_NAMES # ...emerge by slot, not by versionated atom
declare RM_OLD_TEMPFILES # ...remove tempfiles from prior runs
declare SEARCH_BROKEN # ...search for broken libraries and binaries
+declare SEARCH_SYMBOLS # ...search for broken binaries with undefined
symbols
declare VERBOSE # ...give verbose output
# Globals that impact portage directly:
@@ -191,6 +192,7 @@ Broken reverse dependency rebuilder.
(also passed to emerge command)
-P, --no-progress Turn off the progress meter
-q, --quiet Be less verbose (also passed to emerge command)
+ -u, --search-symbols Search for undefined symbols (may have false positives)
-v, --verbose Be more verbose (also passed to emerge command)
Calls emerge, options after -- are ignored by $APP_NAME
@@ -390,6 +392,7 @@ get_longopts() {
--quiet) progress() { :; }
QUIET=1
EMERGE_OPTIONS+=($1);;
+ --search-symbols) SEARCH_SYMBOLS=1;;
--verbose) VERBOSE=1
EMERGE_OPTIONS+=("--verbose");;
--extra-verbose) warn_deprecated_opt
"$1" "--verbose"
@@ -408,7 +411,7 @@ get_longopts() {
# Get single-letter commandline options preceded by a single dash.
get_shortopts() {
local OPT OPTSTRING OPTARG OPTIND
- while getopts ":CdehikL:loPpqu:vX" OPT; do
+ while getopts ":CdehikL:loPpquvX" OPT; do
case "$OPT" in
C) # TODO: Match syntax with the rest of gentoolkit
export NOCOLOR="yes";;
@@ -429,6 +432,7 @@ get_shortopts() {
q) progress() { :; }
QUIET=1
EMERGE_OPTIONS+=("--quiet");;
+ u) SEARCH_SYMBOLS=1;;
v) VERBOSE=1
EMERGE_OPTIONS+=("--verbose");;
X) # No longer used, since it is the default.
@@ -732,6 +736,8 @@ main_checks() {
local ldd_status
local numFiles
local COMPLETE_LD_LIBRARY_PATH
+ local message
+ local broken_lib
if [[ $SEARCH_BROKEN && $FULL_LD_PATH ]]; then
[[ -r "$LDPATH_FILE" && -s "$LDPATH_FILE" ]] ||
die 1 "Unable to find $LDPATH_FILE"
@@ -748,7 +754,7 @@ main_checks() {
if [[ $target_file != *.la ]]; then
# Note: double checking seems to be faster than
single with complete path
# (special add ons are rare).
- ldd_output=$(ldd "$target_file" 2>>
"$ERRORS_FILE" | sort -u)
+ ldd_output=$(ldd -d -r "$target_file" 2>>
"$ERRORS_FILE" | sort -u)
ldd_status=$? # TODO: Check this for problems
with sort
# HACK: if LD_LIBRARY_MASK is null or undefined
grep -vF doesn't work
if grep -vF "${LD_LIBRARY_MASK:=$'\a'}" <<<
"$ldd_output" |
@@ -794,6 +800,34 @@ main_checks() {
fi
fi
fi
+ # Search for symbols not defined
+ if [[ $SEARCH_BROKEN ]]; then
+ # Look for symbol not defined errors
+ if grep -vF "${LD_LIBRARY_MASK:=$'\a'}"
<<< "$ldd_output" |
+ grep -q -E 'symbol .* not
defined'; then
+ message=$(gawk '/symbol .* not
defined/ {NF--; print $0}' <<< "$ldd_output")
+ broken_lib=$(gawk '/symbol .*
not defined/ {print $NF}' <<< "$ldd_output" | \
+ sed 's/[()]//g')
+ echo "obj $broken_lib" >>
"$BROKEN_FILE"
+ echo_v " broken $broken_lib
($message)"
+ fi
+ fi
+ # Look for undefined symbol error if not a .so
file
+ if [[ $SEARCH_BROKEN && $SEARCH_SYMBOLS ]]; then
+ case $target_file in
+ *.so|*.so.*)
+ ;;
+ *)
+ if grep -vF
"${LD_LIBRARY_MASK:=$'\a'}" <<< "$ldd_output" |
+ grep -q -F 'undefined
symbol:'; then
+ message=$(gawk
'/undefined symbol:/ {print $3}' <<< "$ldd_output")
+
message="${message//$'\n'/ }"
+ echo "obj $target_file"
>> "$BROKEN_FILE"
+ echo_v " broken
$target_file (undefined symbols(s): $message)"
+ fi
+ ;;
+ esac
+ fi
elif [[ $SEARCH_BROKEN ]]; then
# Look for broken .la files
la_SEARCH_DIRS="$(parse_ld_so_conf)"
diff --git a/man/revdep-rebuild.1 b/man/revdep-rebuild.1
index 59d7def..d1833e1 100644
--- a/man/revdep-rebuild.1
+++ b/man/revdep-rebuild.1
@@ -44,6 +44,9 @@ Turn off the progress meter
.B \-q | \-\-quiet
Print less output and disable the progress meter. (This option is also passed
to portage.)
.TP
+.B \-u | \-\-search\-symbols
+Searches for undefined symbols in executibles. This will most likely have
false positives in the output, so it is recommended to only use this option
with pretend and manually fix any legitimate issues found. \fBNote:\fR This is
currently only implemented in revdep-rebuild.sh, it is not implemented in
revdep-rebuild.py.
+.TP
.B \-v | \-\-verbose
More output. (Prints the revdep\-rebuild search environment.)
.TP