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