[asan] insert __asan_init into ".preinit_array" section. Linux-only.

git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@146529 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/asan/Makefile.old b/lib/asan/Makefile.old
index 6d3aaf7..32829db 100644
--- a/lib/asan/Makefile.old
+++ b/lib/asan/Makefile.old
@@ -287,8 +287,6 @@
 $(LIBASAN_A): $(BIN) $(LIBASAN_OBJ) $(MAKEFILE)
 	mkdir -p $(LIBASAN_INST_DIR)
 	ar ru $@ $(LIBASAN_OBJ)
-	$(CXX) -shared $(CFLAGS) $(LIBASAN_OBJ) $(LD_FLAGS) -o $(BIN)/libasan$(SUFF).so
-
 
 TEST_OBJECTS_COMMON=\
 	     $(BIN)/asan_test$(SUFF).o \
diff --git a/lib/asan/asan_rtl.cc b/lib/asan/asan_rtl.cc
index 3ea2875..570dd4e 100644
--- a/lib/asan/asan_rtl.cc
+++ b/lib/asan/asan_rtl.cc
@@ -774,3 +774,11 @@
     Report("AddressSanitizer Init done\n");
   }
 }
+
+#ifdef __linux__
+// On Linux, we force __asan_init to be called before anyone else
+// by placing it into .preinit_array section.
+// FIXME: do we have anything like this on Mac?
+__attribute__((section(".preinit_array")))
+  typeof(__asan_init) *__asan_preinit =__asan_init;
+#endif