From df12c60f700b6178609aaea7ac6058c398d4565c Mon Sep 17 00:00:00 2001 From: Luka Perkov Date: Sat, 9 Jun 2012 21:22:37 +0000 Subject: [tools] mklibs: update to 0.1.34 git-svn-id: svn://svn.openwrt.org/openwrt/trunk@32145 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- tools/mklibs/patches/001-missing_includes.patch | 20 ------- .../mklibs/patches/002-disable_symbol_checks.patch | 23 ++++---- tools/mklibs/patches/003-no_copy.patch | 10 ++-- tools/mklibs/patches/004-libpthread_link.patch | 10 ++-- tools/mklibs/patches/005-duplicate_syms.patch | 39 ++++++++++++++ tools/mklibs/patches/005-readelf_fixes.patch | 33 ------------ tools/mklibs/patches/006-duplicate_syms.patch | 32 ----------- tools/mklibs/patches/006-uclibc_init.patch | 14 +++++ tools/mklibs/patches/007-gc_sections.patch | 11 ++++ tools/mklibs/patches/007-uclibc_init.patch | 14 ----- tools/mklibs/patches/008-gc_sections.patch | 11 ---- tools/mklibs/patches/008-uclibc_libgcc_link.patch | 37 +++++++++++++ tools/mklibs/patches/009-uclibc_libgcc_link.patch | 37 ------------- .../patches/009-uclibc_libpthread_symbols.patch | 63 ++++++++++++++++++++++ .../mklibs/patches/010-remove_STT_GNU_IFUNC.patch | 20 +++++++ .../patches/010-uclibc_libpthread_symbols.patch | 63 ---------------------- 16 files changed, 204 insertions(+), 233 deletions(-) delete mode 100644 tools/mklibs/patches/001-missing_includes.patch create mode 100644 tools/mklibs/patches/005-duplicate_syms.patch delete mode 100644 tools/mklibs/patches/005-readelf_fixes.patch delete mode 100644 tools/mklibs/patches/006-duplicate_syms.patch create mode 100644 tools/mklibs/patches/006-uclibc_init.patch create mode 100644 tools/mklibs/patches/007-gc_sections.patch delete mode 100644 tools/mklibs/patches/007-uclibc_init.patch delete mode 100644 tools/mklibs/patches/008-gc_sections.patch create mode 100644 tools/mklibs/patches/008-uclibc_libgcc_link.patch delete mode 100644 tools/mklibs/patches/009-uclibc_libgcc_link.patch create mode 100644 tools/mklibs/patches/009-uclibc_libpthread_symbols.patch create mode 100644 tools/mklibs/patches/010-remove_STT_GNU_IFUNC.patch delete mode 100644 tools/mklibs/patches/010-uclibc_libpthread_symbols.patch (limited to 'tools/mklibs/patches') diff --git a/tools/mklibs/patches/001-missing_includes.patch b/tools/mklibs/patches/001-missing_includes.patch deleted file mode 100644 index 9f3485cb1b..0000000000 --- a/tools/mklibs/patches/001-missing_includes.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/src/mklibs-readelf/elf.cpp -+++ b/src/mklibs-readelf/elf.cpp -@@ -25,6 +25,7 @@ - #include - #include - #include -+#include - - using namespace Elf; - ---- a/src/mklibs-readelf/main.cpp -+++ b/src/mklibs-readelf/main.cpp -@@ -7,6 +7,7 @@ - - #include - #include -+#include - - #include "elf.hpp" - diff --git a/tools/mklibs/patches/002-disable_symbol_checks.patch b/tools/mklibs/patches/002-disable_symbol_checks.patch index 7ec63937c4..44be637609 100644 --- a/tools/mklibs/patches/002-disable_symbol_checks.patch +++ b/tools/mklibs/patches/002-disable_symbol_checks.patch @@ -1,23 +1,20 @@ ---- a/src/mklibs.py -+++ b/src/mklibs.py -@@ -500,7 +500,7 @@ while 1: +--- a/src/mklibs ++++ b/src/mklibs +@@ -524,7 +524,7 @@ while 1: # No progress in last pass. Verify all remaining symbols are weak. for name in unresolved: if not needed_symbols[name].weak: -- raise "Unresolvable symbol %s" % name +- raise Exception("Unresolvable symbol %s" % name) + print "WARNING: Unresolvable symbol %s" % name break previous_pass_unresolved = unresolved -@@ -533,10 +533,7 @@ while 1: - - # which symbols are actually used from each lib +@@ -559,7 +559,7 @@ while 1: for name in needed_symbols: -- if not name in symbol_provider: -- if not needed_symbols[name].weak: -- raise "No library provides non-weak %s" % name -- else: -+ if name in symbol_provider: + if not name in symbol_provider: + if not needed_symbols[name].weak: +- raise Exception("No library provides non-weak %s" % name) ++ print "WARNING: Unresolvable symbol %s" % name + else: lib = symbol_provider[name] library_symbols_used[lib].add(library_symbols[lib][name]) - diff --git a/tools/mklibs/patches/003-no_copy.patch b/tools/mklibs/patches/003-no_copy.patch index bd6505aff9..e0ab2ac88d 100644 --- a/tools/mklibs/patches/003-no_copy.patch +++ b/tools/mklibs/patches/003-no_copy.patch @@ -1,6 +1,6 @@ ---- a/src/mklibs.py -+++ b/src/mklibs.py -@@ -440,7 +440,7 @@ while 1: +--- a/src/mklibs ++++ b/src/mklibs +@@ -463,7 +463,7 @@ while 1: passnr = passnr + 1 # Gather all already reduced libraries and treat them as objects as well small_libs = [] @@ -9,7 +9,7 @@ obj = dest_path + "/" + lib small_libs.append(obj) inode = os.stat(obj)[ST_INO] -@@ -552,12 +552,7 @@ while 1: +@@ -579,12 +579,7 @@ while 1: if not so_file: sys.exit("File not found:" + library) pic_file = find_pic(library) @@ -23,7 +23,7 @@ # we have a pic file, recompile debug(DEBUG_SPAM, "extracting from:", pic_file, "so_file:", so_file) soname = extract_soname(so_file) -@@ -600,22 +595,14 @@ while 1: +@@ -627,22 +622,14 @@ while 1: cmd.append(library_depends_gcc_libnames(so_file)) command(target + "gcc", *cmd) diff --git a/tools/mklibs/patches/004-libpthread_link.patch b/tools/mklibs/patches/004-libpthread_link.patch index b4a6e4f513..657e232b0c 100644 --- a/tools/mklibs/patches/004-libpthread_link.patch +++ b/tools/mklibs/patches/004-libpthread_link.patch @@ -1,13 +1,13 @@ ---- a/src/mklibs.py -+++ b/src/mklibs.py -@@ -105,14 +105,14 @@ def library_depends(obj): +--- a/src/mklibs ++++ b/src/mklibs +@@ -106,14 +106,14 @@ def library_depends(obj): # Return a list of libraries the passed objects depend on. The # libraries are in "-lfoo" format suitable for passing to gcc. -def library_depends_gcc_libnames(obj): +def library_depends_gcc_libnames(obj, soname): if not os.access(obj, os.F_OK): - raise "Cannot find lib: " + obj + raise Exception("Cannot find lib: " + obj) libs = library_depends(obj) ret = [] for i in libs: @@ -17,7 +17,7 @@ if match.group('ld'): ret.append(find_lib(match.group(0))) elif match.group('lib'): -@@ -592,7 +592,7 @@ while 1: +@@ -619,7 +619,7 @@ while 1: cmd.extend(extra_flags) cmd.append("-lgcc") cmd.extend(["-L%s" % a for a in [dest_path] + [sysroot + b for b in lib_path if sysroot == "" or b not in ("/" + libdir + "/", "/usr/" + libdir + "/")]]) diff --git a/tools/mklibs/patches/005-duplicate_syms.patch b/tools/mklibs/patches/005-duplicate_syms.patch new file mode 100644 index 0000000000..b899330f59 --- /dev/null +++ b/tools/mklibs/patches/005-duplicate_syms.patch @@ -0,0 +1,39 @@ +--- a/src/mklibs ++++ b/src/mklibs +@@ -509,10 +509,7 @@ while 1: + num_unresolved = 0 + unresolved = set() + for name in needed_symbols: +- if not name in present_symbols: +- debug(DEBUG_SPAM, "Still need: %s" % name) +- unresolved.add(name) +- num_unresolved = num_unresolved + 1 ++ library_symbols[library][name] = symbol + + debug (DEBUG_NORMAL, `len(needed_symbols)`, "symbols,", + `num_unresolved`, "unresolved") +@@ -531,7 +528,6 @@ while 1: + + library_symbols = {} + library_symbols_used = {} +- symbol_provider = {} + + # WORKAROUND: Always add libgcc on old-abi arm + header = elf_header(find_lib(libraries.copy().pop())) +@@ -557,12 +553,10 @@ while 1: + + # which symbols are actually used from each lib + for name in needed_symbols: +- if not name in symbol_provider: +- if not needed_symbols[name].weak: +- print "WARNING: Unresolvable symbol %s" % name +- else: +- lib = symbol_provider[name] +- library_symbols_used[lib].add(library_symbols[lib][name]) ++ for lib in libraries: ++ if name in library_symbols[lib]: ++ library_symbols_used[lib].add(library_symbols[lib][name]) ++ + + # reduce libraries + for library in libraries: diff --git a/tools/mklibs/patches/005-readelf_fixes.patch b/tools/mklibs/patches/005-readelf_fixes.patch deleted file mode 100644 index 8ae0954551..0000000000 --- a/tools/mklibs/patches/005-readelf_fixes.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- a/src/mklibs-readelf/main.cpp -+++ b/src/mklibs-readelf/main.cpp -@@ -57,6 +57,10 @@ static void process_elf_header (Elf::fil - static void process_dynamics (Elf::file *file, int64_t tag) - { - const Elf::section_type *section = file->get_section_DYNAMIC (); -+ -+ if (!section) -+ return; -+ - for (std::vector::const_iterator it = section->get_dynamics ().begin (); it != section->get_dynamics ().end (); ++it) - { - Elf::dynamic *dynamic = *it; -@@ -67,6 +71,9 @@ static void process_dynamics (Elf::file - - static void process_symbols_provided (const Elf::section_type *section) - { -+ if (!section) -+ return; -+ - for (std::vector::const_iterator it = section->get_symbols ().begin (); it != section->get_symbols ().end (); ++it) - { - const Elf::symbol *symbol = *it; -@@ -95,6 +102,9 @@ static void process_symbols_provided (co - - static void process_symbols_undefined (const Elf::section_type *section) - { -+ if (!section) -+ return; -+ - for (std::vector::const_iterator it = section->get_symbols ().begin (); it != section->get_symbols ().end (); ++it) - { - const Elf::symbol *symbol = *it; diff --git a/tools/mklibs/patches/006-duplicate_syms.patch b/tools/mklibs/patches/006-duplicate_syms.patch deleted file mode 100644 index 3f39ee5bb4..0000000000 --- a/tools/mklibs/patches/006-duplicate_syms.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- a/src/mklibs.py -+++ b/src/mklibs.py -@@ -507,7 +507,6 @@ while 1: - - library_symbols = {} - library_symbols_used = {} -- symbol_provider = {} - - # WORKAROUND: Always add libgcc on old-abi arm - header = elf_header(find_lib(libraries.copy().pop())) -@@ -525,17 +524,13 @@ while 1: - library_symbols_used[library] = set() - for symbol in symbols: - for name in symbol.base_names(): -- if name in symbol_provider: -- debug(DEBUG_SPAM, "duplicate symbol %s in %s and %s" % (symbol, symbol_provider[name], library)) -- else: -- library_symbols[library][name] = symbol -- symbol_provider[name] = library -+ library_symbols[library][name] = symbol - - # which symbols are actually used from each lib - for name in needed_symbols: -- if name in symbol_provider: -- lib = symbol_provider[name] -- library_symbols_used[lib].add(library_symbols[lib][name]) -+ for lib in libraries: -+ if name in library_symbols[lib]: -+ library_symbols_used[lib].add(library_symbols[lib][name]) - - # reduce libraries - for library in libraries: diff --git a/tools/mklibs/patches/006-uclibc_init.patch b/tools/mklibs/patches/006-uclibc_init.patch new file mode 100644 index 0000000000..63b595607c --- /dev/null +++ b/tools/mklibs/patches/006-uclibc_init.patch @@ -0,0 +1,14 @@ +--- a/src/mklibs ++++ b/src/mklibs +@@ -597,6 +597,11 @@ while 1: + extra_post_obj.append(sysroot + libc_extras_dir + "/sofini.o") + symbols.add(ProvidedSymbol('__dso_handle', None, None, 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") ++ + map_file = find_pic_map(library) + if map_file: + extra_flags.append("-Wl,--version-script=" + map_file) diff --git a/tools/mklibs/patches/007-gc_sections.patch b/tools/mklibs/patches/007-gc_sections.patch new file mode 100644 index 0000000000..2a75b675b5 --- /dev/null +++ b/tools/mklibs/patches/007-gc_sections.patch @@ -0,0 +1,11 @@ +--- a/src/mklibs ++++ b/src/mklibs +@@ -609,7 +609,7 @@ while 1: + # compile in only used symbols + cmd = [] + cmd.extend(gcc_options) +- cmd.append("-nostdlib -nostartfiles -shared -Wl,-soname=" + soname) ++ cmd.append("-nostdlib -nostartfiles -shared -Wl,--gc-sections -Wl,-soname=" + soname) + cmd.extend(["-u%s" % a.linker_name() for a in symbols]) + cmd.extend(["-o", dest_path + "/" + so_file_name + "-so"]) + cmd.extend(extra_pre_obj) diff --git a/tools/mklibs/patches/007-uclibc_init.patch b/tools/mklibs/patches/007-uclibc_init.patch deleted file mode 100644 index e76515085c..0000000000 --- a/tools/mklibs/patches/007-uclibc_init.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/src/mklibs.py -+++ b/src/mklibs.py -@@ -571,6 +571,11 @@ while 1: - extra_post_obj.append(sysroot + libc_extras_dir + "/sofini.o") - symbols.add(ProvidedSymbol('__dso_handle', None, None, 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") -+ - map_file = find_pic_map(library) - if map_file: - extra_flags.append("-Wl,--version-script=" + map_file) diff --git a/tools/mklibs/patches/008-gc_sections.patch b/tools/mklibs/patches/008-gc_sections.patch deleted file mode 100644 index 2775493b09..0000000000 --- a/tools/mklibs/patches/008-gc_sections.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/src/mklibs.py -+++ b/src/mklibs.py -@@ -583,7 +583,7 @@ while 1: - # compile in only used symbols - cmd = [] - cmd.extend(gcc_options) -- cmd.append("-nostdlib -nostartfiles -shared -Wl,-soname=" + soname) -+ cmd.append("-nostdlib -nostartfiles -shared -Wl,--gc-sections -Wl,-soname=" + soname) - cmd.extend(["-u%s" % a.linker_name() for a in symbols]) - cmd.extend(["-o", dest_path + "/" + so_file_name + "-so"]) - cmd.extend(extra_pre_obj) diff --git a/tools/mklibs/patches/008-uclibc_libgcc_link.patch b/tools/mklibs/patches/008-uclibc_libgcc_link.patch new file mode 100644 index 0000000000..648b8ef3fd --- /dev/null +++ b/tools/mklibs/patches/008-uclibc_libgcc_link.patch @@ -0,0 +1,37 @@ +--- a/src/mklibs ++++ b/src/mklibs +@@ -113,11 +113,8 @@ def library_depends_gcc_libnames(obj, so + ret = [] + for i in libs: + match = re.match("^(((?Pld\S*)|(lib(?P\S+))))\.so.*$", i) +- if match and not soname in ("libpthread.so.0"): +- if match.group('ld'): +- ret.append(find_lib(match.group(0))) +- elif match.group('lib'): +- ret.append('-l%s' % match.group('lib')) ++ if match: ++ ret.append(find_lib(match.group(0))) + return ' '.join(ret) + + class Symbol(object): +@@ -586,6 +583,7 @@ while 1: + extra_flags = [] + extra_pre_obj = [] + extra_post_obj = [] ++ libgcc_link = find_lib("libgcc_s.so.1") + + symbols.update(library_symbols_used[library]) + +@@ -616,9 +614,10 @@ while 1: + cmd.append(pic_file) + cmd.extend(extra_post_obj) + cmd.extend(extra_flags) +- cmd.append("-lgcc") + cmd.extend(["-L%s" % a for a in [dest_path] + [sysroot + b for b in lib_path if sysroot == "" or b not in ("/" + libdir + "/", "/usr/" + libdir + "/")]]) +- cmd.append(library_depends_gcc_libnames(so_file, soname)) ++ if soname != "libgcc_s.so.1": ++ cmd.append(library_depends_gcc_libnames(so_file, soname)) ++ cmd.append(libgcc_link) + command(target + "gcc", *cmd) + + ## DEBUG diff --git a/tools/mklibs/patches/009-uclibc_libgcc_link.patch b/tools/mklibs/patches/009-uclibc_libgcc_link.patch deleted file mode 100644 index 36f2067193..0000000000 --- a/tools/mklibs/patches/009-uclibc_libgcc_link.patch +++ /dev/null @@ -1,37 +0,0 @@ ---- a/src/mklibs.py -+++ b/src/mklibs.py -@@ -112,11 +112,8 @@ def library_depends_gcc_libnames(obj, so - ret = [] - for i in libs: - match = re.match("^(((?Pld\S*)|(lib(?P\S+))))\.so.*$", i) -- if match and not soname in ("libpthread.so.0"): -- if match.group('ld'): -- ret.append(find_lib(match.group(0))) -- elif match.group('lib'): -- ret.append('-l%s' % match.group('lib')) -+ if match: -+ ret.append(find_lib(match.group(0))) - return ' '.join(ret) - - class Symbol(object): -@@ -560,6 +557,7 @@ while 1: - extra_flags = [] - extra_pre_obj = [] - extra_post_obj = [] -+ libgcc_link = find_lib("libgcc_s.so.1") - - symbols.update(library_symbols_used[library]) - -@@ -590,9 +588,10 @@ while 1: - cmd.append(pic_file) - cmd.extend(extra_post_obj) - cmd.extend(extra_flags) -- cmd.append("-lgcc") - cmd.extend(["-L%s" % a for a in [dest_path] + [sysroot + b for b in lib_path if sysroot == "" or b not in ("/" + libdir + "/", "/usr/" + libdir + "/")]]) -- cmd.append(library_depends_gcc_libnames(so_file, soname)) -+ if soname != "libgcc_s.so.1": -+ cmd.append(library_depends_gcc_libnames(so_file, soname)) -+ cmd.append(libgcc_link) - command(target + "gcc", *cmd) - - ## DEBUG diff --git a/tools/mklibs/patches/009-uclibc_libpthread_symbols.patch b/tools/mklibs/patches/009-uclibc_libpthread_symbols.patch new file mode 100644 index 0000000000..50eb31ab77 --- /dev/null +++ b/tools/mklibs/patches/009-uclibc_libpthread_symbols.patch @@ -0,0 +1,63 @@ +--- a/src/mklibs ++++ b/src/mklibs +@@ -162,9 +162,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 = [] +@@ -205,11 +206,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 + +@@ -500,6 +505,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? +@@ -593,12 +601,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: diff --git a/tools/mklibs/patches/010-remove_STT_GNU_IFUNC.patch b/tools/mklibs/patches/010-remove_STT_GNU_IFUNC.patch new file mode 100644 index 0000000000..6bae8c7ce5 --- /dev/null +++ b/tools/mklibs/patches/010-remove_STT_GNU_IFUNC.patch @@ -0,0 +1,20 @@ +--- a/src/mklibs-readelf/main.cpp ++++ b/src/mklibs-readelf/main.cpp +@@ -84,7 +84,7 @@ static void process_symbols_provided (co + continue; + if (shndx == SHN_UNDEF || shndx == SHN_ABS) + continue; +- if (type != STT_NOTYPE && type != STT_OBJECT && type != STT_FUNC && type != STT_GNU_IFUNC && type != STT_COMMON && type != STT_TLS) ++ if (type != STT_NOTYPE && type != STT_OBJECT && type != STT_FUNC && type != STT_COMMON && type != STT_TLS) + continue; + if (!name.size()) + continue; +@@ -115,7 +115,7 @@ static void process_symbols_undefined (c + continue; + if (shndx != SHN_UNDEF) + continue; +- if (type != STT_NOTYPE && type != STT_OBJECT && type != STT_FUNC && type != STT_GNU_IFUNC && type != STT_COMMON && type != STT_TLS) ++ if (type != STT_NOTYPE && type != STT_OBJECT && type != STT_FUNC && type != STT_COMMON && type != STT_TLS) + continue; + if (!name.size()) + continue; diff --git a/tools/mklibs/patches/010-uclibc_libpthread_symbols.patch b/tools/mklibs/patches/010-uclibc_libpthread_symbols.patch deleted file mode 100644 index 0c97216d1a..0000000000 --- a/tools/mklibs/patches/010-uclibc_libpthread_symbols.patch +++ /dev/null @@ -1,63 +0,0 @@ ---- a/src/mklibs.py -+++ b/src/mklibs.py -@@ -161,9 +161,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 = [] -@@ -204,11 +205,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 - -@@ -476,6 +481,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? -@@ -567,12 +575,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: -- cgit v1.2.3