mirror of
https://git.yoctoproject.org/poky
synced 2026-05-01 06:32:11 +02:00
mklibs-native: avoid failure on symbol provided by application
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. (From OE-Core rev: 0dbc895c58a1bb81467a20b154e068806278fc83) Signed-off-by: Yuanjie Huang <yuanjie.huang@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
71ceb8c60a
commit
3c6ddc78d3
@@ -0,0 +1,102 @@
|
||||
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
|
||||
|
||||
@@ -10,6 +10,7 @@ SRC_URI = "http://ftp.de.debian.org/debian/pool/main/m/mklibs/${BPN}_${PV}.tar.x
|
||||
file://ac_init_fix.patch\
|
||||
file://fix_STT_GNU_IFUNC.patch\
|
||||
file://sysrooted-ldso.patch \
|
||||
file://avoid-failure-on-symbol-provided-by-application.patch \
|
||||
"
|
||||
|
||||
SRC_URI[md5sum] = "e1dafe5f962caa9dc5f2651c0723812a"
|
||||
|
||||
Reference in New Issue
Block a user