debug(DEBUG_SPAM, "provided_symbols adding ", `name`)
result.add(name)
return result
-
+
# Return real target of a symlink
def resolve_link(file):
debug(DEBUG_SPAM, "resolving", file)
outfd = sys.stdout
print >> outfd, "Usage: mklibs [OPTION]... -d DEST FILE ..."
print >> outfd, "Make a set of minimal libraries for FILE(s) in DEST."
- print >> outfd, ""
+ print >> outfd, ""
print >> outfd, " -d, --dest-dir DIRECTORY create libraries in DIRECTORY"
print >> outfd, " -D, --no-default-lib omit default libpath (", string.join(default_lib_path, " : "), ")"
print >> outfd, " -L DIRECTORY[:DIRECTORY]... add DIRECTORY(s) to the library search path"
#################### main ####################
## Usage: ./mklibs.py [OPTION]... -d DEST FILE ...
## Make a set of minimal libraries for FILE ... in directory DEST.
-##
+##
## Options:
## -L DIRECTORY Add DIRECTORY to library search path.
## -D, --no-default-lib Do not use default lib directories of /lib:/usr/lib
## --ldlib Name of dynamic linker (overwrites environment variable ldlib)
## --libc-extras-dir Directory for libc extra files
## --target Use as prefix for gcc or binutils calls
-##
+##
## -d, --dest-dir DIRECTORY Create libraries in DIRECTORY.
-##
+##
## Required arguments for long options are also mandatory for the short options.
# Clean the environment
present_symbols.merge(provided_symbols(lib))
# are we finished?
+ using_ctor_dtor = 0
num_unresolved = 0
present_symbols_elems = present_symbols.elems()
unresolved = Set()
+ string.join(lib_path, " : "))
symbols = provided_symbols(path)
library_symbols[library] = Set()
- library_symbols_used[library] = Set()
+ library_symbols_used[library] = Set()
for symbol in symbols.elems():
if symbol_provider.has_key(symbol):
# in doubt, prefer symbols from libc
library_symbols[library].add(symbol)
symbol_provider[symbol] = library
else:
- debug(DEBUG_SPAM, "duplicate symbol", symbol, "in",
+ debug(DEBUG_SPAM, "duplicate symbol", symbol, "in",
symbol_provider[symbol], "and", library)
else:
library_symbols[library].add(symbol)
symbol_provider[symbol] = library
+ # Fixup support for constructors and destructors
+ if symbol_provider.has_key("_init"):
+ debug(DEBUG_VERBOSE, library, ": Library has a constructor!");
+ using_ctor_dtor = 1
+ library_symbols[library].add("_init")
+ symbol_provider["_init"] = library
+ library_symbols_used[library].add("_init")
+
+ if symbol_provider.has_key("_fini"):
+ debug(DEBUG_VERBOSE, library, ": Library has a destructor!");
+ using_ctor_dtor = 1
+ library_symbols[library].add("_fini")
+ symbol_provider["_fini"] = library
+ library_symbols_used[library].add("_fini")
+
# which symbols are actually used from each lib
for (symbol, is_weak) in needed_symbols.elems():
if not symbol_provider.has_key(symbol):
if not is_weak:
if not uclibc or (symbol != "main"):
- raise "No library provides non-weak " + symbol
+ soname = ''
+# raise "No library provides non-weak " + symbol
else:
lib = symbol_provider[symbol]
library_symbols_used[lib].add(symbol)
joined_symbols = "-u" + string.join(library_symbols_used[library].elems(), " -u")
else:
joined_symbols = ""
+ if using_ctor_dtor == 1:
+ extra_flags = extra_flags + " -shared"
# compile in only used symbols
command(target + "gcc",
"-nostdlib -nostartfiles -shared -Wl,-soname=" + soname,\