Fix for libgcc compat generation script.

  Taking into account possibility that external symbol
  could have been an OBJECT instead of function.

  b/14090368

Change-Id: Iac173d2dd1309ed53024306578137c26b1dbbf15
diff --git a/libc/Android.mk b/libc/Android.mk
index fd14232..0c3cb52 100644
--- a/libc/Android.mk
+++ b/libc/Android.mk
@@ -723,7 +723,6 @@
 LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
 LOCAL_CPPFLAGS := $(libc_common_cppflags)
 LOCAL_C_INCLUDES := $(libc_common_c_includes)
-LOCAL_ARM_MODE := arm # Work around arm linker bug http://b/14090368.
 LOCAL_MODULE := libc_common
 LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
 LOCAL_WHOLE_STATIC_LIBRARIES := \
diff --git a/libc/arch-arm/bionic/libgcc_compat.c b/libc/arch-arm/bionic/libgcc_compat.c
index c45e6e2..10faf2d 100644
--- a/libc/arch-arm/bionic/libgcc_compat.c
+++ b/libc/arch-arm/bionic/libgcc_compat.c
@@ -1,91 +1,159 @@
 /* Generated by genlibgcc_compat.py */
 
-#define   COMPAT_FUNCTIONS_LIST \
-    XX(__adddf3) \
-    XX(__addsf3) \
-    XX(__aeabi_cdcmpeq) \
-    XX(__aeabi_cdcmple) \
-    XX(__aeabi_cdrcmple) \
-    XX(__aeabi_d2f) \
-    XX(__aeabi_d2iz) \
-    XX(__aeabi_dadd) \
-    XX(__aeabi_dcmpeq) \
-    XX(__aeabi_dcmpge) \
-    XX(__aeabi_dcmpgt) \
-    XX(__aeabi_dcmple) \
-    XX(__aeabi_dcmplt) \
-    XX(__aeabi_dcmpun) \
-    XX(__aeabi_ddiv) \
-    XX(__aeabi_dmul) \
-    XX(__aeabi_drsub) \
-    XX(__aeabi_dsub) \
-    XX(__aeabi_f2d) \
-    XX(__aeabi_f2iz) \
-    XX(__aeabi_f2uiz) \
-    XX(__aeabi_fadd) \
-    XX(__aeabi_fcmpun) \
-    XX(__aeabi_fdiv) \
-    XX(__aeabi_fmul) \
-    XX(__aeabi_frsub) \
-    XX(__aeabi_fsub) \
-    XX(__aeabi_i2d) \
-    XX(__aeabi_i2f) \
-    XX(__aeabi_idiv) \
-    XX(__aeabi_idivmod) \
-    XX(__aeabi_l2d) \
-    XX(__aeabi_l2f) \
-    XX(__aeabi_lasr) \
-    XX(__aeabi_ldivmod) \
-    XX(__aeabi_llsl) \
-    XX(__aeabi_llsr) \
-    XX(__aeabi_lmul) \
-    XX(__aeabi_ui2d) \
-    XX(__aeabi_ui2f) \
-    XX(__aeabi_uidiv) \
-    XX(__aeabi_uidivmod) \
-    XX(__aeabi_ul2d) \
-    XX(__aeabi_ul2f) \
-    XX(__aeabi_uldivmod) \
-    XX(__aeabi_unwind_cpp_pr0) \
-    XX(__aeabi_unwind_cpp_pr1) \
-    XX(__cmpdf2) \
-    XX(__divdf3) \
-    XX(__divsf3) \
-    XX(__eqdf2) \
-    XX(__extendsfdf2) \
-    XX(__fixdfsi) \
-    XX(__fixsfsi) \
-    XX(__floatdidf) \
-    XX(__floatdisf) \
-    XX(__floatsidf) \
-    XX(__floatsisf) \
-    XX(__floatundidf) \
-    XX(__floatundisf) \
-    XX(__floatunsidf) \
-    XX(__floatunsisf) \
-    XX(__gedf2) \
-    XX(__gtdf2) \
-    XX(__ledf2) \
-    XX(__ltdf2) \
-    XX(__muldf3) \
-    XX(__muldi3) \
-    XX(__mulsf3) \
-    XX(__nedf2) \
-    XX(__popcount_tab) \
-    XX(__popcountsi2) \
-    XX(__subdf3) \
-    XX(__subsf3) \
-    XX(__truncdfsf2) \
-    XX(__unorddf2) \
-    XX(__unordsf2) \
+extern char __adddf3;
+extern char __addsf3;
+extern char __aeabi_cdcmpeq;
+extern char __aeabi_cdcmple;
+extern char __aeabi_cdrcmple;
+extern char __aeabi_d2f;
+extern char __aeabi_d2iz;
+extern char __aeabi_dadd;
+extern char __aeabi_dcmpeq;
+extern char __aeabi_dcmpge;
+extern char __aeabi_dcmpgt;
+extern char __aeabi_dcmple;
+extern char __aeabi_dcmplt;
+extern char __aeabi_dcmpun;
+extern char __aeabi_ddiv;
+extern char __aeabi_dmul;
+extern char __aeabi_drsub;
+extern char __aeabi_dsub;
+extern char __aeabi_f2d;
+extern char __aeabi_f2iz;
+extern char __aeabi_f2uiz;
+extern char __aeabi_fadd;
+extern char __aeabi_fcmpun;
+extern char __aeabi_fdiv;
+extern char __aeabi_fmul;
+extern char __aeabi_frsub;
+extern char __aeabi_fsub;
+extern char __aeabi_i2d;
+extern char __aeabi_i2f;
+extern char __aeabi_idiv;
+extern char __aeabi_idivmod;
+extern char __aeabi_l2d;
+extern char __aeabi_l2f;
+extern char __aeabi_lasr;
+extern char __aeabi_ldivmod;
+extern char __aeabi_llsl;
+extern char __aeabi_llsr;
+extern char __aeabi_lmul;
+extern char __aeabi_ui2d;
+extern char __aeabi_ui2f;
+extern char __aeabi_uidiv;
+extern char __aeabi_uidivmod;
+extern char __aeabi_ul2d;
+extern char __aeabi_ul2f;
+extern char __aeabi_uldivmod;
+extern char __aeabi_unwind_cpp_pr0;
+extern char __aeabi_unwind_cpp_pr1;
+extern char __cmpdf2;
+extern char __divdf3;
+extern char __divsf3;
+extern char __eqdf2;
+extern char __extendsfdf2;
+extern char __fixdfsi;
+extern char __fixsfsi;
+extern char __floatdidf;
+extern char __floatdisf;
+extern char __floatsidf;
+extern char __floatsisf;
+extern char __floatundidf;
+extern char __floatundisf;
+extern char __floatunsidf;
+extern char __floatunsisf;
+extern char __gedf2;
+extern char __gtdf2;
+extern char __ledf2;
+extern char __ltdf2;
+extern char __muldf3;
+extern char __muldi3;
+extern char __mulsf3;
+extern char __nedf2;
+extern char __popcount_tab;
+extern char __popcountsi2;
+extern char __subdf3;
+extern char __subsf3;
+extern char __truncdfsf2;
+extern char __unorddf2;
+extern char __unordsf2;
 
-
-#define  XX(f)    extern void f(void);
-COMPAT_FUNCTIONS_LIST
-#undef XX
-
-void __bionic_libgcc_compat_hooks(void) {
-#define XX(f)    f();
-COMPAT_FUNCTIONS_LIST
-#undef XX
-}
+void* __bionic_libgcc_compat_symbols[] = {
+    &__adddf3,
+    &__addsf3,
+    &__aeabi_cdcmpeq,
+    &__aeabi_cdcmple,
+    &__aeabi_cdrcmple,
+    &__aeabi_d2f,
+    &__aeabi_d2iz,
+    &__aeabi_dadd,
+    &__aeabi_dcmpeq,
+    &__aeabi_dcmpge,
+    &__aeabi_dcmpgt,
+    &__aeabi_dcmple,
+    &__aeabi_dcmplt,
+    &__aeabi_dcmpun,
+    &__aeabi_ddiv,
+    &__aeabi_dmul,
+    &__aeabi_drsub,
+    &__aeabi_dsub,
+    &__aeabi_f2d,
+    &__aeabi_f2iz,
+    &__aeabi_f2uiz,
+    &__aeabi_fadd,
+    &__aeabi_fcmpun,
+    &__aeabi_fdiv,
+    &__aeabi_fmul,
+    &__aeabi_frsub,
+    &__aeabi_fsub,
+    &__aeabi_i2d,
+    &__aeabi_i2f,
+    &__aeabi_idiv,
+    &__aeabi_idivmod,
+    &__aeabi_l2d,
+    &__aeabi_l2f,
+    &__aeabi_lasr,
+    &__aeabi_ldivmod,
+    &__aeabi_llsl,
+    &__aeabi_llsr,
+    &__aeabi_lmul,
+    &__aeabi_ui2d,
+    &__aeabi_ui2f,
+    &__aeabi_uidiv,
+    &__aeabi_uidivmod,
+    &__aeabi_ul2d,
+    &__aeabi_ul2f,
+    &__aeabi_uldivmod,
+    &__aeabi_unwind_cpp_pr0,
+    &__aeabi_unwind_cpp_pr1,
+    &__cmpdf2,
+    &__divdf3,
+    &__divsf3,
+    &__eqdf2,
+    &__extendsfdf2,
+    &__fixdfsi,
+    &__fixsfsi,
+    &__floatdidf,
+    &__floatdisf,
+    &__floatsidf,
+    &__floatsisf,
+    &__floatundidf,
+    &__floatundisf,
+    &__floatunsidf,
+    &__floatunsisf,
+    &__gedf2,
+    &__gtdf2,
+    &__ledf2,
+    &__ltdf2,
+    &__muldf3,
+    &__muldi3,
+    &__mulsf3,
+    &__nedf2,
+    &__popcount_tab,
+    &__popcountsi2,
+    &__subdf3,
+    &__subsf3,
+    &__truncdfsf2,
+    &__unorddf2,
+    &__unordsf2,
+};
diff --git a/libc/tools/genlibgcc_compat.py b/libc/tools/genlibgcc_compat.py
index f2ff7b0..cb5c3b3 100755
--- a/libc/tools/genlibgcc_compat.py
+++ b/libc/tools/genlibgcc_compat.py
@@ -71,23 +71,7 @@
 import tempfile
 import re
 
-libgcc_compat_header = "/* Generated by genlibgcc_compat.py */\n" + \
-"""
-#define   COMPAT_FUNCTIONS_LIST \\
-"""
-
-libgcc_compat_footer = """
-
-#define  XX(f)    extern void f(void);
-COMPAT_FUNCTIONS_LIST
-#undef XX
-
-void __bionic_libgcc_compat_hooks(void) {
-#define XX(f)    f();
-COMPAT_FUNCTIONS_LIST
-#undef XX
-}
-"""
+libgcc_compat_header = "/* Generated by genlibgcc_compat.py */\n\n"
 
 class Generator:
     def process(self):
@@ -114,29 +98,36 @@
 
         print "* Build complete, logfile: " + build_output_file_path
 
-        func_set = set()
+        symbol_set = set()
         prog=re.compile("(?<=undefined reference to ')\w+")
         fd = open(build_output_file_path, 'r')
         for line in fd:
             m = prog.search(line)
             if m:
-                func_set.add(m.group(0))
+                symbol_set.add(m.group(0))
 
         fd.close()
 
-        func_list = sorted(func_set)
+        symbol_list = sorted(symbol_set)
 
-        print "* Found " + repr(len(func_list)) + " referenced functions: " + repr(func_list)
+        print "* Found " + repr(len(symbol_list)) + " referenced symbols: " + repr(symbol_list)
 
-        if 0 == len(func_list):
-            sys.exit("Error: function list is empty, please check the build log: " + build_output_file_path)
+        if 0 == len(symbol_list):
+            sys.exit("Error: symbol list is empty, please check the build log: " + build_output_file_path)
 
         print "* Generating " + file_path
         fres = open(file_path, 'w')
         fres.write(libgcc_compat_header)
-        for func_name in func_list:
-            fres.write("    XX("+func_name+") \\\n")
-        fres.write(libgcc_compat_footer)
+
+        for sym_name in symbol_list:
+            fres.write("extern char "+sym_name+";\n")
+        fres.write("\n");
+
+        fres.write("void* __bionic_libgcc_compat_symbols[] = {\n");
+        for sym_name in symbol_list:
+            fres.write("    &"+sym_name+",\n")
+        fres.write("};\n");
+
         fres.close()
 
 generator = Generator()