|
@@ -50,7 +50,14 @@ ObjectFile *ObjectFile::createMachOObjectFile(MemoryBuffer *Buffer) {
|
|
|
MachOObject *MachOObj = MachOObject::LoadFromBuffer(Buffer, &Err);
|
|
|
if (!MachOObj)
|
|
|
return NULL;
|
|
|
- return new MachOObjectFile(Buffer, MachOObj, ec);
|
|
|
+ // MachOObject takes ownership of the Buffer we passed to it, and
|
|
|
+ // MachOObjectFile does, too, so we need to make sure they don't get the
|
|
|
+ // same object. A MemoryBuffer is cheap (it's just a reference to memory,
|
|
|
+ // not a copy of the memory itself), so just make a new copy here for
|
|
|
+ // the MachOObjectFile.
|
|
|
+ MemoryBuffer *NewBuffer =
|
|
|
+ MemoryBuffer::getMemBuffer(Buffer->getBuffer(), "", false);
|
|
|
+ return new MachOObjectFile(NewBuffer, MachOObj, ec);
|
|
|
}
|
|
|
|
|
|
/*===-- Symbols -----------------------------------------------------------===*/
|
|
@@ -474,7 +481,7 @@ error_code MachOObjectFile::getSectionName(DataRefImpl DRI,
|
|
|
StringRef &Result) const {
|
|
|
// FIXME: thread safety.
|
|
|
static char result[34];
|
|
|
- if (is64BitLoadCommand(MachOObj, DRI)) {
|
|
|
+ if (is64BitLoadCommand(MachOObj.get(), DRI)) {
|
|
|
InMemoryStruct<macho::Segment64LoadCommand> SLC;
|
|
|
LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
|
|
|
MachOObj->ReadSegment64LoadCommand(LCI, SLC);
|
|
@@ -501,7 +508,7 @@ error_code MachOObjectFile::getSectionName(DataRefImpl DRI,
|
|
|
|
|
|
error_code MachOObjectFile::getSectionAddress(DataRefImpl DRI,
|
|
|
uint64_t &Result) const {
|
|
|
- if (is64BitLoadCommand(MachOObj, DRI)) {
|
|
|
+ if (is64BitLoadCommand(MachOObj.get(), DRI)) {
|
|
|
InMemoryStruct<macho::Section64> Sect;
|
|
|
getSection64(DRI, Sect);
|
|
|
Result = Sect->Address;
|
|
@@ -515,7 +522,7 @@ error_code MachOObjectFile::getSectionAddress(DataRefImpl DRI,
|
|
|
|
|
|
error_code MachOObjectFile::getSectionSize(DataRefImpl DRI,
|
|
|
uint64_t &Result) const {
|
|
|
- if (is64BitLoadCommand(MachOObj, DRI)) {
|
|
|
+ if (is64BitLoadCommand(MachOObj.get(), DRI)) {
|
|
|
InMemoryStruct<macho::Section64> Sect;
|
|
|
getSection64(DRI, Sect);
|
|
|
Result = Sect->Size;
|
|
@@ -529,7 +536,7 @@ error_code MachOObjectFile::getSectionSize(DataRefImpl DRI,
|
|
|
|
|
|
error_code MachOObjectFile::getSectionContents(DataRefImpl DRI,
|
|
|
StringRef &Result) const {
|
|
|
- if (is64BitLoadCommand(MachOObj, DRI)) {
|
|
|
+ if (is64BitLoadCommand(MachOObj.get(), DRI)) {
|
|
|
InMemoryStruct<macho::Section64> Sect;
|
|
|
getSection64(DRI, Sect);
|
|
|
Result = MachOObj->getData(Sect->Offset, Sect->Size);
|
|
@@ -543,7 +550,7 @@ error_code MachOObjectFile::getSectionContents(DataRefImpl DRI,
|
|
|
|
|
|
error_code MachOObjectFile::getSectionAlignment(DataRefImpl DRI,
|
|
|
uint64_t &Result) const {
|
|
|
- if (is64BitLoadCommand(MachOObj, DRI)) {
|
|
|
+ if (is64BitLoadCommand(MachOObj.get(), DRI)) {
|
|
|
InMemoryStruct<macho::Section64> Sect;
|
|
|
getSection64(DRI, Sect);
|
|
|
Result = uint64_t(1) << Sect->Align;
|
|
@@ -557,7 +564,7 @@ error_code MachOObjectFile::getSectionAlignment(DataRefImpl DRI,
|
|
|
|
|
|
error_code MachOObjectFile::isSectionText(DataRefImpl DRI,
|
|
|
bool &Result) const {
|
|
|
- if (is64BitLoadCommand(MachOObj, DRI)) {
|
|
|
+ if (is64BitLoadCommand(MachOObj.get(), DRI)) {
|
|
|
InMemoryStruct<macho::Section64> Sect;
|
|
|
getSection64(DRI, Sect);
|
|
|
Result = !strcmp(Sect->Name, "__text");
|
|
@@ -664,7 +671,7 @@ relocation_iterator MachOObjectFile::getSectionRelBegin(DataRefImpl Sec) const {
|
|
|
}
|
|
|
relocation_iterator MachOObjectFile::getSectionRelEnd(DataRefImpl Sec) const {
|
|
|
uint32_t last_reloc;
|
|
|
- if (is64BitLoadCommand(MachOObj, Sec)) {
|
|
|
+ if (is64BitLoadCommand(MachOObj.get(), Sec)) {
|
|
|
InMemoryStruct<macho::Section64> Sect;
|
|
|
getSection64(Sec, Sect);
|
|
|
last_reloc = Sect->NumRelocationTableEntries;
|