--- a/src/mklibs +++ b/src/mklibs @@ -173,9 +173,10 @@ def undefined_symbols(obj): return result class ProvidedSymbol(Symbol): - def __init__(self, name, version, library, default_version): + def __init__(self, name, version, library, default_version, weak): super(ProvidedSymbol, self).__init__(name, version, library) self.default_version = default_version + self.weak = weak def base_names(self): ret = [] @@ -216,11 +217,15 @@ def provided_symbols(obj): if version_string.lower() not in ('base', 'none'): version = version_string + weak = False + if weak_string.lower() == 'true': + weak = True + default_version = False if default_version_string.lower() == 'true': default_version = True - result.append(ProvidedSymbol(name, version, library, default_version)) + result.append(ProvidedSymbol(name, version, library, default_version, weak)) return result @@ -509,6 +514,9 @@ while 1: debug(DEBUG_SPAM, "present_symbols adding %s" % symbol) names = symbol.base_names() for name in names: + if name in present_symbols: + if symbol.library != present_symbols[name].library: + needed_symbols[name] = UndefinedSymbol(name, True, symbol.version, symbol.library) present_symbols[name] = symbol # are we finished? @@ -600,12 +608,16 @@ while 1: # may segfault in ptmalloc_init due to undefined weak reference extra_pre_obj.append(sysroot + libc_extras_dir + "/soinit.o") extra_post_obj.append(sysroot + libc_extras_dir + "/sofini.o") - symbols.add(ProvidedSymbol('__dso_handle', None, None, True)) + symbols.add(ProvidedSymbol('__dso_handle', None, None, True, True)) - if soname in ("libc.so.0"): - symbols.add(ProvidedSymbol('__uClibc_init', None, None, True)) - symbols.add(ProvidedSymbol('__uClibc_fini', None, None, True)) - extra_flags.append("-Wl,-init,__uClibc_init") + if soname == "libc.so.0": + symbols.add(ProvidedSymbol('__uClibc_init', None, None, True, True)) + symbols.add(ProvidedSymbol('__uClibc_fini', None, None, True, True)) + extra_pre_obj.append("-Wl,-init,__uClibc_init") + + if soname == "libpthread.so.0": + symbols.add(ProvidedSymbol('__pthread_initialize_minimal_internal', None, None, True, True)) + extra_flags.append("-Wl,-z,nodelete,-z,initfirst,-init=__pthread_initialize_minimal_internal") map_file = find_pic_map(library) if map_file: