librsloader.cpp revision 58ed8bce80acd10ea103dc9c94f83466fa500ac9
158ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien#include "librsloader.h" 258ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien 358ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien#include "ELFObject.h" 458ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien#include "ELFSectionSymTab.h" 558ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien#include "ELFSymbol.h" 658ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien 758ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien#include "utils/serialize.h" 858ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien 958ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien#define LOG_TAG "bcc" 1058ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien#include "cutils/log.h" 1158ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien 1258ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien#include <llvm/ADT/OwningPtr.h> 1358ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien 1458ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chienstatic inline RSExecRef wrap(ELFObject<32> *object) { 1558ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien return reinterpret_cast<RSExecRef>(object); 1658ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien} 1758ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien 1858ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chienstatic inline ELFObject<32> *unwrap(RSExecRef object) { 1958ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien return reinterpret_cast<ELFObject<32> *>(object); 2058ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien} 2158ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien 2258ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chienextern "C" RSExecRef 2358ed8bce80acd10ea103dc9c94f83466fa500ac9Logan ChienrsloaderCreateExec(unsigned char const *buf, 2458ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien size_t buf_size, 2558ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien void *(*find_symbol)(void *, char const *), 2658ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien void *find_symbol_context) { 2758ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien 2858ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien ArchiveReaderLE AR(buf, buf_size); 2958ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien 3058ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien llvm::OwningPtr<ELFObject<32> > object(ELFObject<32>::read(AR)); 3158ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien if (!object) { 3258ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien LOGE("Unable to load the ELF object."); 3358ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien return NULL; 3458ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien } 3558ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien 3658ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien //object->print(); 3758ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien object->relocate(find_symbol, find_symbol_context); 3858ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien 3958ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien return wrap(object.take()); 4058ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien} 4158ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien 4258ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chienextern "C" void rsloaderDisposeExec(RSExecRef object) { 4358ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien delete unwrap(object); 4458ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien} 4558ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien 4658ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chienextern "C" void *rsloaderGetSymbolAddress(RSExecRef object_, 4758ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien char const *name) { 4858ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien ELFObject<32> *object = unwrap(object_); 4958ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien 5058ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien ELFSectionSymTab<32> *symtab = 5158ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien static_cast<ELFSectionSymTab<32> *>(object->getSectionByName(".symtab")); 5258ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien 5358ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien return symtab->getByName(name)->getAddress(); 5458ed8bce80acd10ea103dc9c94f83466fa500ac9Logan Chien} 55