#define BS32_handle_protocol   88 // offsetof(efi_boot_services_32_t, handle_protocol)
 #define LI32_image_base                32 // offsetof(efi_loaded_image_32_t, image_base)
 
-       __HEAD
+       .text
        .code32
 SYM_FUNC_START(efi32_pe_entry)
 /*
 
        call    1f
 1:     pop     %ebx
-       subl    $ rva(1b), %ebx
 
        /* Get the loaded image protocol pointer from the image handle */
        leal    -4(%ebp), %eax
        pushl   %eax                            // &loaded_image
-       leal    rva(loaded_image_proto)(%ebx), %eax
+       leal    (loaded_image_proto - 1b)(%ebx), %eax
        pushl   %eax                            // pass the GUID address
        pushl   8(%ebp)                         // pass the image handle
 
        movl    12(%ebp), %edx                  // sys_table
        movl    -4(%ebp), %esi                  // loaded_image
        movl    LI32_image_base(%esi), %esi     // loaded_image->image_base
-       movl    %ebx, %ebp                      // startup_32 for efi32_pe_stub_entry
+       leal    (startup_32 - 1b)(%ebx), %ebp   // runtime address of startup_32
        /*
         * We need to set the image_offset variable here since startup_32() will
         * use it before we get to the 64-bit efi_pe_entry() in C code.
         */
-       subl    %esi, %ebx
-       movl    %ebx, rva(image_offset)(%ebp)   // save image_offset
+       subl    %esi, %ebp                      // calculate image_offset
+       movl    %ebp, (image_offset - 1b)(%ebx) // save image_offset
        xorl    %esi, %esi
        jmp     efi32_entry                     // pass %ecx, %edx, %esi
                                                // no other registers remain live