Changed resource alignment behaviour for ELF64 binaries.

The current behaviour of aligning to the maximum value of p_align seen
is problematic for x86_64, as the default segment alignment is 2MB.
This causes all x86_64 binaries to be padded to at least 2MB when
resources are added to them. There is no need to align to p_align in
the file itself (it's only an in-memory requirement), therefore
instead just align up to an 8-byte boundary. The current behaviour is
retained for ELF32, so this won't cause any compatibility problems
(there are no existing ELF64 BeOS/Haiku binaries to worry about).
This commit is contained in:
Alex Smith
2012-08-01 10:35:34 +01:00
parent 57e2ce542e
commit f7010474bb
+17 -5
View File
@@ -636,12 +636,24 @@ ResourceFile::_InitELFXFile(BFile& file, uint64 fileSize)
}
// align the offset
if (resourceAlignment < kELFMinResourceAlignment)
resourceAlignment = kELFMinResourceAlignment;
if (resourceAlignment > kELFMaxResourceAlignment) {
throw Exception(B_IO_ERROR, "The ELF object file requires an invalid "
"alignment: %lu.", resourceAlignment);
if (fileHeader.e_ident[EI_CLASS] == ELFCLASS64) {
// For ELF64 binaries we use a different alignment behaviour. It is
// not necessary to align the position of the resources in the file to
// the maximum value of p_align, and in fact on x86_64 this behaviour
// causes an undesirable effect: since the default segment alignment is
// 2MB, aligning to p_align causes all binaries to be at least 2MB when
// resources have been added. So, just align to an 8-byte boundary.
resourceAlignment = 8;
} else {
// Retain previous alignment behaviour for compatibility.
if (resourceAlignment < kELFMinResourceAlignment)
resourceAlignment = kELFMinResourceAlignment;
if (resourceAlignment > kELFMaxResourceAlignment) {
throw Exception(B_IO_ERROR, "The ELF object file requires an "
"invalid alignment: %lu.", resourceAlignment);
}
}
resourceOffset = align_value(resourceOffset, resourceAlignment);
if (resourceOffset >= fileSize) {
// throw Exception("The ELF object file does not contain resources.");