Fix module constructor order.

.preinit_array goes before the constructors of LD_PRELOAD-ed libraries.

Change-Id: I1af32ce29eaf3ca4351ae8a0f7f5da5165853216
diff --git a/linker/linker.cpp b/linker/linker.cpp
index a19fd45..59b7893 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -1276,6 +1276,15 @@
     }
 }
 
+static void soinfo_call_preinit_constructors(soinfo *si)
+{
+  TRACE("[ %5d Calling preinit_array @ 0x%08x [%d] for '%s' ]\n",
+      pid, (unsigned)si->preinit_array, si->preinit_array_count,
+      si->name);
+  call_array(si->preinit_array, si->preinit_array_count, 0);
+  TRACE("[ %5d Done calling preinit_array for '%s' ]\n", pid, si->name);
+}
+
 void soinfo_call_constructors(soinfo *si)
 {
     if (si->constructors_called)
@@ -1294,17 +1303,9 @@
     //    out above, the libc constructor will be called again (recursively!).
     si->constructors_called = 1;
 
-    if (si->flags & FLAG_EXE) {
-        TRACE("[ %5d Calling preinit_array @ 0x%08x [%d] for '%s' ]\n",
-              pid, (unsigned)si->preinit_array, si->preinit_array_count,
-              si->name);
-        call_array(si->preinit_array, si->preinit_array_count, 0);
-        TRACE("[ %5d Done calling preinit_array for '%s' ]\n", pid, si->name);
-    } else {
-        if (si->preinit_array) {
-            DL_ERR("shared library \"%s\" has a preinit_array table @ 0x%08x. "
-                   "This is INVALID.", si->name, (unsigned) si->preinit_array);
-        }
+    if (!(si->flags & FLAG_EXE) && si->preinit_array) {
+      DL_ERR("shared library \"%s\" has a preinit_array table @ 0x%08x. "
+          "This is INVALID.", si->name, (unsigned) si->preinit_array);
     }
 
     if (si->dynamic) {
@@ -1897,6 +1898,8 @@
         exit(-1);
     }
 
+    soinfo_call_preinit_constructors(si);
+
     for(i = 0; preloads[i] != NULL; i++) {
         soinfo_call_constructors(preloads[i]);
     }