[PATCH] COFF: Minor fix to Section size calculation
Keno Fischer
kfischer at college.harvard.edu
Mon Jun 30 12:54:32 PDT 2014
Bump. I'm not really sure who could best review this.
On Tue, Jun 10, 2014 at 1:49 PM, Keno Fischer <kfischer at college.harvard.edu>
wrote:
> I noticed llvm-dwarfdump was crashing on COFF dlls with embedded DWARF
> debug info. The reason was that SizeOfRawData actually indicates the size
> on disc which is not the size of the actual section data in a PE file
> (*.dll, *.exe), because of alignment rules. Instead the size of given by
> min(SizeOfRawData,VirtualSize).
>
> I'm not sure what to do with respect to testing, since compiling a file
> from source would require a COFF capable linker. Is it acceptable to commit
> an entire PE exectuable to the repository? If so, I'll try to come up with
> a minimal example where this happens.
>
> http://reviews.llvm.org/D4087
>
> Files:
> lib/Object/COFFObjectFile.cpp
>
> Index: lib/Object/COFFObjectFile.cpp
> ===================================================================
> --- lib/Object/COFFObjectFile.cpp
> +++ lib/Object/COFFObjectFile.cpp
> @@ -829,11 +829,21 @@
> // 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;
> + // COFF requires sections to follow certain alignment rules in PE
> + // files. Thus (in a PE file) a section's actual data may be smaller
> + // than SizeOfRawData.
> + // Since for debug sections later on the actual data matters, we take
> + // the min of SizeOfRawData and VirtualSize which is the acutal size
> + // of the data.
> + uintptr_t Size = Sec->SizeOfRawData;
> + // COFF Object files always have VirtualSize set to 0
> + if (Sec->VirtualSize != 0)
> + Size = std::min(Size,(uintptr_t)Sec->VirtualSize);
> + uintptr_t ConEnd = ConStart + Size;
> if (ConEnd > uintptr_t(Data->getBufferEnd()))
> return object_error::parse_failed;
> Res = ArrayRef<uint8_t>(reinterpret_cast<const unsigned
> char*>(ConStart),
> - Sec->SizeOfRawData);
> + Size);
> return object_error::success;
> }
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140630/0a96c98f/attachment.html>
More information about the llvm-commits
mailing list