From f172101130604e4a9efa5746f4d8d30de99a0fdc Mon Sep 17 00:00:00 2001
From: Yuanjie Huang <yuanjie.huang@windriver.com>
Date: Fri, 17 Apr 2015 14:48:20 +0800
Subject: [PATCH] avoid failure on symbol provided by application

Upstream-Status: Pending

Undefined symbols in a library can be provided by the application
that links to the library, such as `logsink' in libmultipath.so.0.
This fix checks the type of object in which the symbol is needed
and the existence of the symbol in application, when a symbol
cannot be provided by libraries. It prevents false alarm on absence
of symbols.

Signed-off-by: Yuanjie Huang <yuanjie.huang@windriver.com>
---
 src/mklibs | 28 ++++++++++++++++++++++++----
 1 file changed, 24 insertions(+), 4 deletions(-)

diff --git a/src/mklibs b/src/mklibs
index c5614ea..b0d9034 100755
--- a/src/mklibs
+++ b/src/mklibs
@@ -133,9 +133,9 @@ class Symbol(object):
         return '@'.join(ret)
 
 class UndefinedSymbol(Symbol):
-    def __init__(self, name, weak, version, library):
+    def __init__(self, name, weak, version, library, object):
         super(UndefinedSymbol, self).__init__(name, version, library)
-        self.weak, self.library = weak, library
+        self.weak, self.library, self.object = weak, library, object
 
 # Return undefined symbols in an object as a set of tuples (name, weakness)
 def undefined_symbols(obj):
@@ -144,6 +144,11 @@ def undefined_symbols(obj):
 
     output = command("mklibs-readelf", "--print-symbols-undefined", obj)
 
+    if len(obj) > len(dest_path) and obj[:len(dest_path)] == dest_path:
+        object = obj[len(dest_path) + 1:-len('-so-stripped')]
+    else:
+        object = obj
+
     result = []
     for line in output:
         name, weak_string, version_string, library_string = line.split()[:4]
@@ -160,7 +165,7 @@ def undefined_symbols(obj):
         if library_string.lower() != 'none':
             library = library_string
 
-        result.append(UndefinedSymbol(name, weak, version, library))
+        result.append(UndefinedSymbol(name, weak, version, library, object))
 
     return result
 
@@ -495,12 +500,13 @@ while 1:
                      and re.search("^ps_", str(symbol)))
                 and not (re.search("ld-linux.so.3$", str(symbol)))
                 and not (re.search("^__gnu_local_gp", str(symbol)))):
-                debug(DEBUG_SPAM, "needed_symbols adding %s, weak: %s" % (symbol, symbol.weak))
+                debug(DEBUG_SPAM, "needed_symbols adding %s, weak: %s, for %s" % (symbol, symbol.weak, obj))
                 needed_symbols[str(symbol)] = symbol
         libraries.update(library_depends(obj))
 
     # calculate what symbols are present in small_libs and available_libs
     present_symbols = {}
+    present_symbol_progs = {}
     checked_libs = small_libs
     checked_libs.extend(available_libs)
     checked_libs.append(ldlib)
@@ -510,6 +516,12 @@ while 1:
             names = symbol.base_names()
             for name in names:
                 present_symbols[name] = symbol
+            if not so_pattern.match(lib):
+                debug(DEBUG_SPAM, "present_symbol_progs adding %s, from executable %s" % (' '.join(names), lib))
+                for name in names:
+                    progs = present_symbol_progs.get(name, set())
+                    progs.add(lib)
+                    present_symbol_progs[name] = progs
 
     # are we finished?
     num_unresolved = 0
@@ -565,6 +577,14 @@ while 1:
     for name in needed_symbols:
         if not name in symbol_provider:
             if not needed_symbols[name].weak:
+                # WORKAROUND: Undefined symbols in a library can be provided by the application
+                # that links to the library. So if the object which requires the symbol is a library
+                # and some application can provide the symbol, the undefined symbol is skipped.
+                symbol = needed_symbols[name]
+                if so_pattern.match(symbol.object) and present_symbol_progs.get(name, None):
+                    debug(DEBUG_SPAM, "symbol %s in library %s is provided by executable %s" \
+                          % (name, symbol.object, ' '.join(present_symbol_progs[name])))
+                    continue
                 raise Exception("No library provides non-weak %s" % name)
         else:
             lib = symbol_provider[name]
-- 
1.8.5.2.233.g932f7e4

