www.usr.com/support/gpl/USR9107_release.1.4.tar.gz
[bcm963xx.git] / userapps / opensource / libcreduction / mklibs.py
index 394192d..16d5739 100755 (executable)
@@ -176,7 +176,7 @@ def provided_symbols(obj):
                 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)
@@ -229,7 +229,7 @@ def usage(was_err):
         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"
@@ -250,7 +250,7 @@ def version(vers):
 #################### 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
@@ -261,9 +261,9 @@ def version(vers):
 ##   --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
@@ -422,6 +422,7 @@ while 1:
         present_symbols.merge(provided_symbols(lib))
 
     # are we finished?
+    using_ctor_dtor = 0
     num_unresolved = 0
     present_symbols_elems = present_symbols.elems()
     unresolved = Set()
@@ -458,7 +459,7 @@ while 1:
                      + 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
@@ -466,18 +467,34 @@ while 1:
                     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)
@@ -526,6 +543,8 @@ while 1:
                 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,\