Allow dlclose() to properly call static C++ destructors.

With this patch _and_ an upcoming build/ patch, the destruction
of static C++ objects contained in shared libraries will happen
properly when dlclose() is called.

Note that this change introduces crtbegin_so.S and crtend_so.S which
are currently ignored by the build system.

+ move definition of __dso_handle to the right place
(before that, all shared libraries used the __dso_handle
global variable from the C library).

Note that we keep a 'weak' __dso_handle in aeabi.c to avoid
breaking the build until the next patch to build/core/combo/
appears. We will be able to remove that later.

+ move bionic/aeabi.c to arch-arm/bionic/ (its proper location)

NOTE: The NDK will need to be modified to enable this feature in
         the shared libraries that are generated through it.

Change-Id: I99cd801375bbaef0581175893d1aa0943211b9bc
diff --git a/libc/arch-x86/bionic/crtbegin_so.S b/libc/arch-x86/bionic/crtbegin_so.S
index d49e9df..d879fef 100644
--- a/libc/arch-x86/bionic/crtbegin_so.S
+++ b/libc/arch-x86/bionic/crtbegin_so.S
@@ -1,3 +1,10 @@
+# This function is to be called when the shared library
+# is unloaded through dlclose()
+_on_dlclose:
+    lea __dso_handle, %eax
+    call __cxa_finalize
+    ret
+
 /* we put the _init() function here in case the user files for the shared
  * libs want to drop things into .init section.
  * We then will call our ctors from crtend_so.o */
@@ -20,6 +27,7 @@
 .globl __FINI_ARRAY__
 __FINI_ARRAY__:
     .long -1
+    .long _on_dlclose
 
 .section .ctors, "aw"
 .align 4
@@ -27,3 +35,5 @@
 .globl __CTOR_LIST__
 __CTOR_LIST__:
         .long -1
+
+#include "__dso_handle.S"