Add LC_BUILD_VERSION load command
Summary: Add a new load command LC_BUILD_VERSION. It is a generic version of LC_*_VERSION_MIN load_command used on Apple platforms. Instead of having a seperate load command for each platform, LC_BUILD_VERSION is recording platform info as an enum. It also records SDK version, min_os, and tools that used to build the binary. rdar://problem/29781291 Reviewers: enderby Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D29044 llvm-svn: 292824
This commit is contained in:
@@ -809,6 +809,27 @@ static Error checkNoteCommand(const MachOObjectFile &Obj,
|
||||
return Error::success();
|
||||
}
|
||||
|
||||
static Error
|
||||
parseBuildVersionCommand(const MachOObjectFile &Obj,
|
||||
const MachOObjectFile::LoadCommandInfo &Load,
|
||||
SmallVectorImpl<const char*> &BuildTools,
|
||||
uint32_t LoadCommandIndex) {
|
||||
MachO::build_version_command BVC =
|
||||
getStruct<MachO::build_version_command>(Obj, Load.Ptr);
|
||||
if (Load.C.cmdsize !=
|
||||
sizeof(MachO::build_version_command) +
|
||||
BVC.ntools * sizeof(MachO::build_tool_version))
|
||||
return malformedError("load command " + Twine(LoadCommandIndex) +
|
||||
" LC_BUILD_VERSION_COMMAND has incorrect cmdsize");
|
||||
|
||||
auto Start = Load.Ptr + sizeof(MachO::build_version_command);
|
||||
BuildTools.resize(BVC.ntools);
|
||||
for (unsigned i = 0; i < BVC.ntools; ++i)
|
||||
BuildTools[i] = Start + i * sizeof(MachO::build_tool_version);
|
||||
|
||||
return Error::success();
|
||||
}
|
||||
|
||||
static Error checkRpathCommand(const MachOObjectFile &Obj,
|
||||
const MachOObjectFile::LoadCommandInfo &Load,
|
||||
uint32_t LoadCommandIndex) {
|
||||
@@ -1308,6 +1329,9 @@ MachOObjectFile::MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian,
|
||||
} else if (Load.C.cmd == MachO::LC_NOTE) {
|
||||
if ((Err = checkNoteCommand(*this, Load, I, Elements)))
|
||||
return;
|
||||
} else if (Load.C.cmd == MachO::LC_BUILD_VERSION) {
|
||||
if ((Err = parseBuildVersionCommand(*this, Load, BuildTools, I)))
|
||||
return;
|
||||
} else if (Load.C.cmd == MachO::LC_RPATH) {
|
||||
if ((Err = checkRpathCommand(*this, Load, I)))
|
||||
return;
|
||||
@@ -3322,6 +3346,16 @@ MachOObjectFile::getNoteLoadCommand(const LoadCommandInfo &L) const {
|
||||
return getStruct<MachO::note_command>(*this, L.Ptr);
|
||||
}
|
||||
|
||||
MachO::build_version_command
|
||||
MachOObjectFile::getBuildVersionLoadCommand(const LoadCommandInfo &L) const {
|
||||
return getStruct<MachO::build_version_command>(*this, L.Ptr);
|
||||
}
|
||||
|
||||
MachO::build_tool_version
|
||||
MachOObjectFile::getBuildToolVersion(unsigned index) const {
|
||||
return getStruct<MachO::build_tool_version>(*this, BuildTools[index]);
|
||||
}
|
||||
|
||||
MachO::dylib_command
|
||||
MachOObjectFile::getDylibIDLoadCommand(const LoadCommandInfo &L) const {
|
||||
return getStruct<MachO::dylib_command>(*this, L.Ptr);
|
||||
|
||||
Reference in New Issue
Block a user