[llvm] r219388 - Object, COFF: Cap the section contents to min(VirtualSize, SizeOfRawData)

Rafael EspĂ­ndola rafael.espindola at gmail.com
Thu Oct 16 13:22:06 PDT 2014


This should be testable with "llvm-readobj -section-data", no?

On 9 October 2014 03:49, David Majnemer <david.majnemer at gmail.com> wrote:
> Author: majnemer
> Date: Thu Oct  9 02:49:28 2014
> New Revision: 219388
>
> URL: http://llvm.org/viewvc/llvm-project?rev=219388&view=rev
> Log:
> Object, COFF: Cap the section contents to min(VirtualSize, SizeOfRawData)
>
> It is not useful to return the data beyond VirtualSize it's less than
> SizeOfRawData.
>
> An implementation detail of COFF requires the section size to be rounded
> up to a multiple of FileAlignment; this means that SizeOfRawData is not
> representative of how large the section is.  Instead, we should cap it
> to VirtualSize when this occurs as it represents the true size of the
> section.
>
> Note that this is only relevant in executable files because this
> rounding doesn't occur in object files (and VirtualSize is always zero).
>
> Modified:
>     llvm/trunk/lib/Object/COFFObjectFile.cpp
>
> Modified: llvm/trunk/lib/Object/COFFObjectFile.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/COFFObjectFile.cpp?rev=219388&r1=219387&r2=219388&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Object/COFFObjectFile.cpp (original)
> +++ llvm/trunk/lib/Object/COFFObjectFile.cpp Thu Oct  9 02:49:28 2014
> @@ -869,19 +869,33 @@ std::error_code COFFObjectFile::getSecti
>  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.
> +  // 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;
> -  uintptr_t ConEnd = ConStart + Sec->SizeOfRawData;
> +  // SizeOfRawData and VirtualSize change what they represent depending on
> +  // whether or not we have an executable image.
> +  //
> +  // For object files, SizeOfRawData contains the size of section's data;
> +  // VirtualSize is always zero.
> +  //
> +  // For executables, SizeOfRawData *must* be a multiple of FileAlignment; the
> +  // 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;
> +  if (Sec->VirtualSize)
> +    DataSize = std::min(Sec->VirtualSize, Sec->SizeOfRawData);
> +  else
> +    DataSize = Sec->SizeOfRawData;
> +  uintptr_t ConEnd = ConStart + DataSize;
>    if (ConEnd > uintptr_t(Data.getBufferEnd()))
>      return object_error::parse_failed;
> -  Res = makeArrayRef(reinterpret_cast<const uint8_t*>(ConStart),
> -                     Sec->SizeOfRawData);
> +  Res = makeArrayRef(reinterpret_cast<const uint8_t *>(ConStart), DataSize);
>    return object_error::success;
>  }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list