}
uint64_t COFFObjectFile::getSectionSize(DataRefImpl Ref) const {
- const coff_section *Sec = toSec(Ref);
- return Sec->SizeOfRawData;
+ return getSectionSize(toSec(Ref));
}
std::error_code COFFObjectFile::getSectionContents(DataRefImpl Ref,
return object_error::success;
}
-std::error_code
-COFFObjectFile::getSectionContents(const coff_section *Sec,
- ArrayRef<uint8_t> &Res) const {
- // PointerToRawData and SizeOfRawData won't make sense for BSS sections,
- // don't do anything interesting for them.
- assert((Sec->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) == 0 &&
- "BSS sections don't have contents!");
- // The only thing that we need to verify is that the contents is contained
- // within the file bounds. We don't need to make sure it doesn't cover other
- // data, as there's nothing that says that is not allowed.
- uintptr_t ConStart = uintptr_t(base()) + Sec->PointerToRawData;
+uint64_t COFFObjectFile::getSectionSize(const coff_section *Sec) const {
// SizeOfRawData and VirtualSize change what they represent depending on
// whether or not we have an executable image.
//
// actual section size is in VirtualSize. It is possible for VirtualSize to
// be greater than SizeOfRawData; the contents past that point should be
// considered to be zero.
- uint32_t DataSize;
+ uint32_t SectionSize;
if (Sec->VirtualSize)
- DataSize = std::min(Sec->VirtualSize, Sec->SizeOfRawData);
+ SectionSize = std::min(Sec->VirtualSize, Sec->SizeOfRawData);
else
- DataSize = Sec->SizeOfRawData;
- uintptr_t ConEnd = ConStart + DataSize;
+ SectionSize = Sec->SizeOfRawData;
+
+ return SectionSize;
+}
+
+std::error_code
+COFFObjectFile::getSectionContents(const coff_section *Sec,
+ ArrayRef<uint8_t> &Res) const {
+ // PointerToRawData and SizeOfRawData won't make sense for BSS sections,
+ // don't do anything interesting for them.
+ assert((Sec->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) == 0 &&
+ "BSS sections don't have contents!");
+ // The only thing that we need to verify is that the contents is contained
+ // within the file bounds. We don't need to make sure it doesn't cover other
+ // data, as there's nothing that says that is not allowed.
+ uintptr_t ConStart = uintptr_t(base()) + Sec->PointerToRawData;
+ uint32_t SectionSize = getSectionSize(Sec);
+ uintptr_t ConEnd = ConStart + SectionSize;
if (ConEnd > uintptr_t(Data.getBufferEnd()))
return object_error::parse_failed;
- Res = makeArrayRef(reinterpret_cast<const uint8_t *>(ConStart), DataSize);
+ Res = makeArrayRef(reinterpret_cast<const uint8_t *>(ConStart), SectionSize);
return object_error::success;
}