At CodeSourcery we're enhancing mklibs for use as a general-purpose tool for reducing shared libraries for root filesystems together with EGLIBC <http://www.eglibc.org/> in a cross-compilation environment. In the process we've added some features to mklibs useful in such an environment, and fixed a couple of bugs in mklibs-readelf. The patch is appended; if the new features aren't of interest because they aren't relevant to how Debian uses mklibs, we'll distribute the patch from the EGLIBC website, but I hope at least the mklibs-readelf bugfixes will be of use.
The features added are: * --sysroot, to locate all libraries and other related input files relative to a specified root directory rather than /. (This is different from the existing --root option.) * --gcc-options, to pass multilib options to gcc when relinking. * --libdir, to use names such as "lib64" or "lib32" in place of lib in the default directory names. The mklibs-readelf bugs fixed are: * One place failed to convert endianness of data from the input file, so causing failures when host and target have different endianness. * Certain fields were uninitialized (for some input files) but later compared against NULL, relying on the uninitialized data happening to be 0; fixed by explicitly initializing them. Index: src/mklibs.1 =================================================================== --- src/mklibs.1 (revision 51247) +++ src/mklibs.1 (working copy) @@ -28,6 +28,16 @@ \fB\-\-target \fITARGET Prepend \fITARGET\fB\-\fR to the gcc and binutils calls. .TP +\fB\-\-sysroot \fISYSROOT +Locate libraries and associated files relative to \fISYSROOT\fR. +.TP +\fB\-\-gcc\-options \fIOPTIONS +Pass \fIOPTIONS\fR to the compiler when relinking. +.TP +\fB\-\-libdir \fIDIR +Use \fIDIR\fR (for example, \fBlib64\fR) in place of \fBlib\fR in +default library paths. +.TP \fB\-v\fR, \fB\-\-verbose Explain what is being done. .TP Index: src/mklibs-readelf/elf.cpp =================================================================== --- src/mklibs-readelf/elf.cpp (revision 51247) +++ src/mklibs-readelf/elf.cpp (working copy) @@ -114,6 +114,9 @@ this->sections.resize (this->shnum); + section_GNU_VERDEF = NULL; + section_GNU_VERNEED = NULL; + section_GNU_VERSYM = NULL; for (unsigned int i = 0; i < this->shnum; i++) { section *temp; @@ -149,6 +152,7 @@ this->segments.resize (this->phnum); + segment_INTERP = NULL; for (unsigned int i = 0; i < this->phnum; i++) { segment *temp; @@ -376,7 +380,7 @@ this->versyms.reserve (max); for (unsigned int i = 0; i < max; i++) - this->versyms.push_back (versyms[i]); + this->versyms.push_back (convert<_data, typeof (versyms[i])> () (versyms[i])); } template <typename _class, typename _data> Index: src/mklibs.py =================================================================== --- src/mklibs.py (revision 51247) +++ src/mklibs.py (working copy) @@ -185,8 +185,8 @@ # Find complete path of a library, by searching in lib_path def find_lib(lib): for path in lib_path: - if os.access(path + "/" + lib, os.F_OK): - return path + "/" + lib + if os.access(sysroot + path + "/" + lib, os.F_OK): + return sysroot + path + "/" + lib return "" @@ -194,7 +194,7 @@ def find_pic(lib): base_name = so_pattern.match(lib).group(1) for path in lib_path: - for file in glob.glob(path + "/" + base_name + "_pic.a"): + for file in glob.glob(sysroot + path + "/" + base_name + "_pic.a"): if os.access(file, os.F_OK): return resolve_link(file) return "" @@ -203,7 +203,7 @@ def find_pic_map(lib): base_name = so_pattern.match(lib).group(1) for path in lib_path: - for file in glob.glob(path + "/" + base_name + "_pic.map"): + for file in glob.glob(sysroot + path + "/" + base_name + "_pic.map"): if os.access(file, os.F_OK): return resolve_link(file) return "" @@ -230,6 +230,9 @@ print >> outfd, " --libc-extras-dir DIRECTORY look for libc extra files in DIRECTORY" print >> outfd, " --target TARGET prepend TARGET- to the gcc and binutils calls" print >> outfd, " --root ROOT search in ROOT for library rpaths" + print >> outfd, " --sysroot ROOT prepend ROOT to all paths for libraries" + print >> outfd, " --gcc-options OPTIONS pass OPTIONS to gcc" + print >> outfd, " --libdir DIR use DIR (e.g. lib64) in place of lib in default paths" print >> outfd, " -v, --verbose explain what is being done" print >> outfd, " -h, --help display this help and exit" sys.exit(was_err) @@ -264,7 +267,8 @@ # Argument parsing opts = "L:DnvVhd:r:l:" longopts = ["no-default-lib", "dry-run", "verbose", "version", "help", - "dest-dir=", "ldlib=", "libc-extras-dir=", "target=", "root="] + "dest-dir=", "ldlib=", "libc-extras-dir=", "target=", "root=", + "sysroot=", "gcc-options=", "libdir="] # some global variables lib_rpath = [] @@ -274,9 +278,13 @@ include_default_lib_path = "yes" default_lib_path = ["/lib/", "/usr/lib/", "/usr/X11R6/lib/"] libc_extras_dir = "/usr/lib/libc_pic" +libc_extras_dir_default = True +libdir = "lib" target = "" root = "" +sysroot = "" force_libs = [] +gcc_options = [] so_pattern = re.compile("((lib|ld).*)\.so(\..+)*") script_pattern = re.compile("^#!\s*/") @@ -300,12 +308,19 @@ ldlib = arg elif opt == "--libc-extras-dir": libc_extras_dir = arg + libc_extras_dir_default = False elif opt == "--target": target = arg + "-" elif opt in ("-r", "--root"): root = arg + elif opt == "--sysroot": + sysroot = arg elif opt in ("-l",): force_libs.append(arg) + elif opt == "--gcc-options": + gcc_options.extend(string.split(arg, " ")) + elif opt == "--libdir": + libdir = arg elif opt in ("--help", "-h"): usage(0) sys.exit(0) @@ -316,8 +331,11 @@ print "WARNING: unknown option: " + opt + "\targ: " + arg if include_default_lib_path == "yes": - lib_path.extend(default_lib_path) + lib_path.extend([a.replace("/lib/", "/" + libdir + "/") for a in default_lib_path]) +if libc_extras_dir_default: + libc_extras_dir = libc_extras_dir.replace("/lib/", "/" + libdir + "/") + if ldlib == "LDLIB": ldlib = os.getenv("ldlib") @@ -344,6 +362,8 @@ if not ldlib: sys.exit("E: Dynamic linker not found, aborting.") +ldlib = sysroot + ldlib + debug(DEBUG_NORMAL, "I: Using", ldlib, "as dynamic linker.") # Check for rpaths @@ -514,8 +534,8 @@ if soname in ("libc.so.6", "libc.so.6.1"): # force dso_handle.os to be included, otherwise reduced libc # may segfault in ptmalloc_init due to undefined weak reference - extra_pre_obj.append(libc_extras_dir + "/soinit.o") - extra_post_obj.append(libc_extras_dir + "/sofini.o") + 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', 'Base', True)) map_file = find_pic_map(library) @@ -524,6 +544,7 @@ # compile in only used symbols cmd = [] + cmd.extend(gcc_options) cmd.append("-nostdlib -nostartfiles -shared -Wl,-soname=" + soname) cmd.extend(["-u%s" % a.linker_name() for a in symbols]) cmd.extend(["-o", dest_path + "/" + so_file_name + "-so"]) @@ -532,7 +553,7 @@ cmd.extend(extra_post_obj) cmd.extend(extra_flags) cmd.append("-lgcc") - cmd.extend(["-L%s" % a for a in [dest_path] + lib_path]) + cmd.extend(["-L%s" % a for a in [dest_path] + [sysroot + b for b in lib_path]]) cmd.append(library_depends_gcc_libnames(so_file)) command(target + "gcc", *cmd) -- Joseph S. Myers [EMAIL PROTECTED] -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]