Skip to content

Second-stage's loaded image ImageSize is wrong on IA32 #515

@nicholasbishop

Description

@nicholasbishop

In pe.c, it sets the ImageBase and ImageSize in EFI_LOADED_IMAGE for the second stage: https://github.com/rhboot/shim/blob/main/pe.c#L1394

On the IA32 target, this doesn't work properly because the ImageSize field is not correctly aligned. ImageSize is a UINT64. Fields are supposed to be "naturally aligned". Naturally the spec doesn't bother to specify exactly what "naturally aligned" means, but other toolchains such as EDK2 seem to think it means a UINT64 should be 8-byte aligned.

In other words, offsetof(EFI_LOADED_IMAGE, ImageSize) on IA32 is 40 in EDK2, but 36 in shim due to the missing padding.

I think a straightforward fix would be to add -malign-double on IA32 (as EDK2 does), which will align "double, long double, and long long variables on a two-word boundary".

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions