diff options
Diffstat (limited to 'tools/mklibs/patches')
-rw-r--r-- | tools/mklibs/patches/002-disable_symbol_checks.patch | 20 | ||||
-rw-r--r-- | tools/mklibs/patches/003-no_copy.patch | 50 | ||||
-rw-r--r-- | tools/mklibs/patches/004-libpthread_link.patch | 28 | ||||
-rw-r--r-- | tools/mklibs/patches/005-duplicate_syms.patch | 35 | ||||
-rw-r--r-- | tools/mklibs/patches/006-uclibc_init.patch | 14 | ||||
-rw-r--r-- | tools/mklibs/patches/007-gc_sections.patch | 11 | ||||
-rw-r--r-- | tools/mklibs/patches/008-uclibc_libgcc_link.patch | 37 | ||||
-rw-r--r-- | tools/mklibs/patches/009-uclibc_libpthread_symbols.patch | 63 | ||||
-rw-r--r-- | tools/mklibs/patches/010-remove_STT_GNU_IFUNC.patch | 20 | ||||
-rw-r--r-- | tools/mklibs/patches/011-remove_multiarch.patch | 10 |
10 files changed, 288 insertions, 0 deletions
diff --git a/tools/mklibs/patches/002-disable_symbol_checks.patch b/tools/mklibs/patches/002-disable_symbol_checks.patch new file mode 100644 index 000000000..44be63760 --- /dev/null +++ b/tools/mklibs/patches/002-disable_symbol_checks.patch @@ -0,0 +1,20 @@ +--- 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 Exception("Unresolvable symbol %s" % name) ++ print "WARNING: Unresolvable symbol %s" % name + break + + previous_pass_unresolved = unresolved +@@ -559,7 +559,7 @@ while 1: + for name in needed_symbols: + 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 new file mode 100644 index 000000000..e0ab2ac88 --- /dev/null +++ b/tools/mklibs/patches/003-no_copy.patch @@ -0,0 +1,50 @@ +--- 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 = [] +- for lib in regexpfilter(os.listdir(dest_path), "(.*-so-stripped)$"): ++ for lib in regexpfilter(os.listdir(dest_path), "(.*-so)$"): + obj = dest_path + "/" + lib + small_libs.append(obj) + inode = os.stat(obj)[ST_INO] +@@ -579,12 +579,7 @@ while 1: + if not so_file: + sys.exit("File not found:" + library) + pic_file = find_pic(library) +- if not pic_file: +- # No pic file, so we have to use the .so file, no reduction +- debug(DEBUG_VERBOSE, "No pic file found for", so_file, "; copying") +- command(target + "objcopy", "--strip-unneeded -R .note -R .comment", +- so_file, dest_path + "/" + so_file_name + "-so-stripped") +- else: ++ if pic_file: + # we have a pic file, recompile + debug(DEBUG_SPAM, "extracting from:", pic_file, "so_file:", so_file) + soname = extract_soname(so_file) +@@ -627,22 +622,14 @@ while 1: + cmd.append(library_depends_gcc_libnames(so_file)) + command(target + "gcc", *cmd) + +- # strip result +- command(target + "objcopy", "--strip-unneeded -R .note -R .comment", +- dest_path + "/" + so_file_name + "-so", +- dest_path + "/" + so_file_name + "-so-stripped") + ## DEBUG + debug(DEBUG_VERBOSE, so_file, "\t", `os.stat(so_file)[ST_SIZE]`) + debug(DEBUG_VERBOSE, dest_path + "/" + so_file_name + "-so", "\t", + `os.stat(dest_path + "/" + so_file_name + "-so")[ST_SIZE]`) +- debug(DEBUG_VERBOSE, dest_path + "/" + so_file_name + "-so-stripped", +- "\t", `os.stat(dest_path + "/" + so_file_name + "-so-stripped")[ST_SIZE]`) + + # Finalising libs and cleaning up +-for lib in regexpfilter(os.listdir(dest_path), "(.*)-so-stripped$"): +- os.rename(dest_path + "/" + lib + "-so-stripped", dest_path + "/" + lib) +-for lib in regexpfilter(os.listdir(dest_path), "(.*-so)$"): +- os.remove(dest_path + "/" + lib) ++for lib in regexpfilter(os.listdir(dest_path), "(.*)-so$"): ++ os.rename(dest_path + "/" + lib + "-so", dest_path + "/" + lib) + + # Canonicalize library names. + for lib in regexpfilter(os.listdir(dest_path), "(.*so[.\d]*)$"): diff --git a/tools/mklibs/patches/004-libpthread_link.patch b/tools/mklibs/patches/004-libpthread_link.patch new file mode 100644 index 000000000..657e232b0 --- /dev/null +++ b/tools/mklibs/patches/004-libpthread_link.patch @@ -0,0 +1,28 @@ +--- 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 Exception("Cannot find lib: " + obj) + libs = library_depends(obj) + ret = [] + for i in libs: + match = re.match("^(((?P<ld>ld\S*)|(lib(?P<lib>\S+))))\.so.*$", i) +- if match: ++ if match and not soname in ("libpthread.so.0"): + if match.group('ld'): + ret.append(find_lib(match.group(0))) + elif match.group('lib'): +@@ -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 + "/")]]) +- cmd.append(library_depends_gcc_libnames(so_file)) ++ cmd.append(library_depends_gcc_libnames(so_file, soname)) + command(target + "gcc", *cmd) + + ## DEBUG diff --git a/tools/mklibs/patches/005-duplicate_syms.patch b/tools/mklibs/patches/005-duplicate_syms.patch new file mode 100644 index 000000000..8428abfc9 --- /dev/null +++ b/tools/mklibs/patches/005-duplicate_syms.patch @@ -0,0 +1,35 @@ +--- a/src/mklibs ++++ b/src/mklibs +@@ -531,7 +531,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())) +@@ -549,20 +548,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 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/006-uclibc_init.patch b/tools/mklibs/patches/006-uclibc_init.patch new file mode 100644 index 000000000..2df7fe435 --- /dev/null +++ b/tools/mklibs/patches/006-uclibc_init.patch @@ -0,0 +1,14 @@ +--- a/src/mklibs ++++ b/src/mklibs +@@ -595,6 +595,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 000000000..068d88a53 --- /dev/null +++ b/tools/mklibs/patches/007-gc_sections.patch @@ -0,0 +1,11 @@ +--- a/src/mklibs ++++ b/src/mklibs +@@ -607,7 +607,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 000000000..432a313b6 --- /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("^(((?P<ld>ld\S*)|(lib(?P<lib>\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): +@@ -584,6 +581,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]) + +@@ -614,9 +612,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 000000000..34866f729 --- /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? +@@ -591,12 +599,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 000000000..6bae8c7ce --- /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/011-remove_multiarch.patch b/tools/mklibs/patches/011-remove_multiarch.patch new file mode 100644 index 000000000..a32d8ee17 --- /dev/null +++ b/tools/mklibs/patches/011-remove_multiarch.patch @@ -0,0 +1,10 @@ +--- a/src/mklibs ++++ b/src/mklibs +@@ -263,6 +263,7 @@ def extract_soname(so_file): + return "" + + def multiarch(paths): ++ return paths + devnull = open('/dev/null', 'w') + dpkg_architecture = subprocess.Popen( + ['dpkg-architecture', '-qDEB_HOST_MULTIARCH'], |