Validate defined versions in prelink_image

Validate the list of defined versions explicitly, during library
prelinking, rather than implicitly as part of constructing the
VersionTracker in soinfo::link_image.

Doing the validation upfront allows removing the symbol lookup failure
code paths, which only happen on a library with invalid version
information.

Helps on the walleye 64-bit linker relocation benchmark (146.2ms ->
131.6ms)

Bug: none
Test: bionic unit tests
Change-Id: Id17508aba3af2863909f0526897c4277419322b7
diff --git a/linker/linker_soinfo.h b/linker/linker_soinfo.h
index 1cb727c..9ae17ea 100644
--- a/linker/linker_soinfo.h
+++ b/linker/linker_soinfo.h
@@ -243,9 +243,7 @@
 
   soinfo_list_t& get_parents();
 
-  bool find_symbol_by_name(SymbolName& symbol_name,
-                           const version_info* vi,
-                           const ElfW(Sym)** symbol) const;
+  const ElfW(Sym)* find_symbol_by_name(SymbolName& symbol_name, const version_info* vi) const;
 
   ElfW(Sym)* find_symbol_by_address(const void* addr);
   ElfW(Addr) resolve_symbol_address(const ElfW(Sym)* s) const;
@@ -310,10 +308,10 @@
   bool is_image_linked() const;
   void set_image_linked();
 
-  bool elf_lookup(SymbolName& symbol_name, const version_info* vi, uint32_t* symbol_index) const;
-  ElfW(Sym)* elf_addr_lookup(const void* addr);
-  bool gnu_lookup(SymbolName& symbol_name, const version_info* vi, uint32_t* symbol_index) const;
+  const ElfW(Sym)* gnu_lookup(SymbolName& symbol_name, const version_info* vi) const;
+  const ElfW(Sym)* elf_lookup(SymbolName& symbol_name, const version_info* vi) const;
   ElfW(Sym)* gnu_addr_lookup(const void* addr);
+  ElfW(Sym)* elf_addr_lookup(const void* addr);
 
   bool lookup_version_info(const VersionTracker& version_tracker, ElfW(Word) sym,
                            const char* sym_name, const version_info** vi);