Add RTLD_NODELETE flag support

Bug: 18186310
Bug: https://code.google.com/p/android/issues/detail?id=64069

(cherry picked from commit 1b20dafdbe65e43b9f4c95057e8482380833ea91)

Change-Id: Ic02eec22a7c322ece65eb40730a3404f611526b1
diff --git a/linker/linker.h b/linker/linker.h
index 6329efd..ebb4793 100644
--- a/linker/linker.h
+++ b/linker/linker.h
@@ -134,7 +134,7 @@
 #endif
 
   soinfo* next;
-  unsigned flags;
+  uint32_t flags;
 
  private:
   const char* strtab;
@@ -143,8 +143,8 @@
 
   size_t nbucket;
   size_t nchain;
-  unsigned* bucket;
-  unsigned* chain;
+  uint32_t* bucket;
+  uint32_t* chain;
 
 #if defined(__mips__) || !defined(__LP64__)
   // This is only used by mips and mips64, but needs to be here for
@@ -179,12 +179,12 @@
 
 #if defined(__arm__)
   // ARM EABI section used for stack unwinding.
-  unsigned* ARM_exidx;
+  uint32_t* ARM_exidx;
   size_t ARM_exidx_count;
 #elif defined(__mips__)
-  unsigned mips_symtabno;
-  unsigned mips_local_gotno;
-  unsigned mips_gotsym;
+  uint32_t mips_symtabno;
+  uint32_t mips_local_gotno;
+  uint32_t mips_gotsym;
 #endif
 
   size_t ref_count;
@@ -224,10 +224,12 @@
   ElfW(Addr) resolve_symbol_address(ElfW(Sym)* s);
 
   const char* get_string(ElfW(Word) index) const;
+  bool can_unload() const;
 
   bool inline has_min_version(uint32_t min_version) const {
     return (flags & FLAG_NEW_SOINFO) != 0 && version >= min_version;
   }
+
  private:
   void CallArray(const char* array_name, linker_function_t* functions, size_t count, bool reverse);
   void CallFunction(const char* function_name, linker_function_t function);
@@ -258,7 +260,7 @@
   friend soinfo* get_libdl_info();
 };
 
-extern soinfo* get_libdl_info();
+soinfo* get_libdl_info();
 
 void do_android_get_LD_LIBRARY_PATH(char*, size_t);
 void do_android_update_LD_LIBRARY_PATH(const char* ld_library_path);