Author: Scot Doyle <lkml14@scotdoyle.com>
Description: load_linux: relocate protected-mode code as intended
 If the kernel is relocatable and the protected mode code will not fit
 in the initially determined location, that code will be moved to the
 next available location. However, beginning with commit 8f470e7b, the
 code is moved to the initially determined location instead of the next
 available location because prot_mode_base is no longer updated to the
 correct location. Since whdr->code32_start is updated, it is pointing
 to the wrong execution start location, random code is executed and
 the machine is rebooted.
 .
 Restore the old behavior by assigning prot_mode_base the value of
 base. Tested on a machine that exposed this behavior.

diff -Naurp syslinux.orig/com32/lib/syslinux/load_linux.c syslinux/com32/lib/syslinux/load_linux.c
--- syslinux.orig/com32/lib/syslinux/load_linux.c
+++ syslinux/com32/lib/syslinux/load_linux.c
@@ -323,6 +323,7 @@ int bios_boot_linux(void *kernel_buf, si
     }
 
     whdr->code32_start += base - prot_mode_base;
+    prot_mode_base = base;
 
     /* Real mode code */
     if (syslinux_memmap_find(amap, &real_mode_base,
