Difference between revisions of "PXELINUX-Multi-Arch"

From Syslinux Wiki
Jump to: navigation, search
(Common directory distinct config: Call c32 by name; INCLUDE)
(Corrections. Wiki formatting. Add examples. Add wiki categories.)
Line 1: Line 1:
 
[[Category:PXELINUX]]
 
[[Category:PXELINUX]]
 +
[[Category:Examples]]
 +
[[Category:HowTo]]
 +
[[Category:TFTP]]
 
Placing respective boot loader files for multiple firmware architectures (BIOS, EFI IA32 and EFI X64) into one common TFTP root, requires careful attention:
 
Placing respective boot loader files for multiple firmware architectures (BIOS, EFI IA32 and EFI X64) into one common TFTP root, requires careful attention:
 
* each boot loader file will search for the same configuration files; and,
 
* each boot loader file will search for the same configuration files; and,
Line 16: Line 19:
 
* <tt>syslinux.efi</tt> (<tt>efi32/efi/syslinux.efi</tt> renamed uniquely, e.g. as syslnx32.efi or bootia32.efi) together with <tt>ldlinux.e32</tt> (EFI IA32); and,  
 
* <tt>syslinux.efi</tt> (<tt>efi32/efi/syslinux.efi</tt> renamed uniquely, e.g. as syslnx32.efi or bootia32.efi) together with <tt>ldlinux.e32</tt> (EFI IA32); and,  
 
* <tt>syslinux.efi</tt> (<tt>efi64/efi/syslinux.efi</tt> renamed uniquely, e.g. as syslnx64.efi or bootx64.efi) together with <tt>ldlinux.e64</tt> (EFI X64).
 
* <tt>syslinux.efi</tt> (<tt>efi64/efi/syslinux.efi</tt> renamed uniquely, e.g. as syslnx64.efi or bootx64.efi) together with <tt>ldlinux.e64</tt> (EFI X64).
 +
 +
Example:
 +
<pre>
 +
default:
 +
  DEFAULT mylabel
 +
  LABEL mylabel
 +
  KERNEL boot/vmlinuz
 +
  INITRD boot/initrd
 +
  APPEND myoptions
 +
  SYSAPPEND bitmask
 +
</pre>
 +
 +
Instead of the KERNEL directive,
 +
an alternative [[Config#KERNEL-LIKE_DIRECTIVES|KERNEL-LIKE directive]]
 +
could be used when appropriate.
  
 
== Common directory distinct config ==
 
== Common directory distinct config ==
Line 24: Line 42:
 
** encapsulating within vendor-options (DHCP option 43); or,  
 
** encapsulating within vendor-options (DHCP option 43); or,  
 
** forcibly inserting it into the {{nowrap|offer/acknowledgment}}, as it is not requested by default; or by,
 
** forcibly inserting it into the {{nowrap|offer/acknowledgment}}, as it is not requested by default; or by,
* {{nowrap|built-in}} options, coded into the booting {{nowrap|pxelinux.0/syslinux.efi}} binary by means of the {{nowrap|<tt>pxelinux-options</tt>}} tool. In this case, clients running the same binary would use a single config.
+
* {{nowrap|built-in}} options, coded into the booting {{nowrap|pxelinux.0/syslinux.efi}} binary by means of the [[PXELINUX#Hardcoded_options|{{nowrap|<tt>pxelinux-options</tt>}}]] tool. In this case, clients running the same binary would use a single config.
  
Each architecture should be configured to utilize a respective configuration file that includes a [[Directives/path|PATH]] statement to an {{nowrap|architecture-specific}} directory for c32 modules. If you call c32 modules only by name (ie "COM32 vesamenu.c32"), PXELINUX will then automatically search into the paths specified when the module is not found in the current directory.
+
Each architecture should be configured to utilize a respective configuration file that includes a [[Directives/path|PATH]] statement to an {{nowrap|architecture-specific}} directory for c32 modules.  
 +
The PATH directive always assumes absolute paths in its argument.
  
From here, you can then utilize the INCLUDE directive to include more configuration files (that might be common) to build out your desired environment.
+
The [[PXELINUX#Working_directory|Working Directory]] can be changed by means of the [[Config#CONFIG|CONFIG]] directive.
 +
{{nowrap|In-common}} configuration files can be [[Config#INCLUDE|INCLUDE]]ed. For either directive, adequate relative paths are especially important in this setup.
 +
 
 +
Relative paths are based on
 +
the [[PXELINUX#Working_directory|Current Working Directory]].
 +
The initial Working Directory is either:
 +
* the tftproot; or,
 +
* the parent directory of the bootloader file; or,
 +
* set by dhcp option 210 (pathprefix); or,
 +
* hardcoded by the <tt>pxelinux-options</tt> tool.
 +
 
 +
For the following example,
 +
the bios.cfg file is the default configuration file for BIOS clients;
 +
the efi32.cfg file is the default configuration file for EFI IA32 clients;
 +
the efi64.cfg file is the default configuration file for EFI X64 clients.
 +
 
 +
<pre>
 +
/tftproot/
 +
          |_ boot/
 +
          |      |_ vmlinuz
 +
          |      |_ initrd
 +
          |      |_ splash.png
 +
          |      |_ ...
 +
          |
 +
          |_ bios.cfg
 +
          |_ efi32.cfg
 +
          |_ ef64.cfg
 +
          |_ pxelinux.0
 +
          |_ ldlinux.c32
 +
          |_ bootia32.efi
 +
          |_ ldlinux.e32
 +
          |_ bootx64.efi
 +
          |_ ldlinux.e64
 +
          |_ ...
 +
          |
 +
          |_ bios/
 +
          |      |_ (bios)*.c32
 +
          |      |_ ...
 +
          |
 +
          |_ efi32/
 +
          |      |_ (efi32)*.c32
 +
          |      |_ ...
 +
          |
 +
          |_ efi64/
 +
          |      |_ (efi32)*.c32
 +
          |      |_ ...
 +
          |_ ...
 +
</pre>
 +
<pre>
 +
bios.cfg:
 +
  PATH bios
 +
  UI bios/vesamenu.c32
 +
  INCLUDE common.cfg
 +
 
 +
efi32.cfg:
 +
  PATH efi32
 +
  UI efi32/vesamenu.c32
 +
  INCLUDE common.cfg
 +
 
 +
efi64.cfg:
 +
  PATH efi64
 +
  UI efi64/vesamenu.c32
 +
  INCLUDE common.cfg
 +
 
 +
common.cfg:
 +
  #
 +
  # When the in-common config is INCLUDEed in this setup, then
 +
  # there should be no references to c32 modules in it.
 +
  #
 +
  MENU BACKGROUND boot/splash.png
 +
  DEFAULT mylabel
 +
  LABEL mylabel
 +
  KERNEL boot/vmlinuz
 +
</pre>
 +
 
 +
See also:
 +
* [[Directives/path]]
 +
* [[PXELINUX#Working_directory]]
 +
* [[Config#INCLUDE]]
 +
* [[Config#CONFIG]]
  
 
== Distinct directory ==
 
== Distinct directory ==
Line 38: Line 136:
 
EFI64 clients will load {{nowrap|"efi64/syslinux.efi"}}.  
 
EFI64 clients will load {{nowrap|"efi64/syslinux.efi"}}.  
 
This setup allows all architectures to use their full capabilities.
 
This setup allows all architectures to use their full capabilities.
 +
 +
Example:
 +
<pre>
 +
default:
 +
  UI vesamenu.c32
 +
  DEFAULT mylabel
 +
  LABEL mylabel
 +
  KERNEL vmlinuz
 +
</pre>
 +
 +
When booting with {{nowrap|"''/tftproot/bios/pxelinux.0''"}},
 +
the [[PXELINUX#Working_directory|Current Working Directory]]
 +
is {{nowrap|"''/tftproot/bios/''"}}.
 +
 +
When booting with {{nowrap|"''/tftproot/efi32/syslinux.efi''"}},
 +
the Current Working Directory is {{nowrap|"''/tftproot/efi32/''"}}.
 +
 +
When booting with {{nowrap|"''/tftproot/efi64/syslinux.efi''"}},
 +
the Current Working Directory is {{nowrap|"''/tftproot/efi64/''"}}.
 +
  
 
=== Distinct directory common kernel path ===
 
=== Distinct directory common kernel path ===
  
When referencing a kernel file (e.g. vmlinuz), reference a common path.  
+
Note: The ''paths and file names'' used in this section are examples only, and are not to be interpreted verbatim.
 +
 
 +
When referencing a kernel file (e.g. ''vmlinuz''), reference a common path.  
 
For example:  
 
For example:  
* "::boot/vmlinuz" - TFTP path to current TFTP server starting in its root; or,  
+
* ":<nowiki/>:boot/vmlinuz" - TFTP path to current TFTP server starting in its root; or,  
 
* "<nowiki>http://192.0.2.3/boot/vmlinuz</nowiki>" - using a system capable of HTTP transfer, provided by:
 
* "<nowiki>http://192.0.2.3/boot/vmlinuz</nowiki>" - using a system capable of HTTP transfer, provided by:
 
** pxelinux.0 atop gPXE/iPXE with HTTP support; or,  
 
** pxelinux.0 atop gPXE/iPXE with HTTP support; or,  
Line 52: Line 172:
 
as it does not strip a directory but rather adds another part to the path that the TFTP server must then interpret,  
 
as it does not strip a directory but rather adds another part to the path that the TFTP server must then interpret,  
 
which one hopes it would be effective (but it is often not).
 
which one hopes it would be effective (but it is often not).
 +
 +
Example:
 +
<pre>
 +
/tftproot/
 +
          |_ boot/
 +
          |      |_ vmlinuz
 +
          |      |_ ...
 +
          |
 +
          |_ bios/
 +
          |      |_ pxelinux.0
 +
          |      |_ ldlinux.c32
 +
          |      |_ default
 +
          |      |_ (bios)*.c32
 +
          |      |_ ...
 +
          |
 +
          |_ efi32/
 +
          |      |_ boot/
 +
          |      |      |_ vmlinuz
 +
          |      |      |_ ...
 +
          |      |
 +
          |      |_ syslinux.efi
 +
          |      |_ ldlinux.e32
 +
          |      |_ default
 +
          |      |_ (efi32)*.c32
 +
          |      |_ ...
 +
          |
 +
          |_ efi64/
 +
          |      |_ syslinux.efi
 +
          |      |_ ldlinux.e64
 +
          |      |_ default
 +
          |      |_ (efi64)*.c32
 +
          |      |_ ...
 +
          |
 +
          |_ ...
 +
</pre>
 +
<pre>
 +
default:
 +
  UI vesamenu.c32
 +
  DEFAULT mylabel
 +
  LABEL mylabel
 +
  KERNEL ::boot/vmlinuz
 +
</pre>
 +
 +
The double colon symbol {{nowrap|("<tt>:<nowiki/>:</tt>")}} is an absolute path to the tftproot.
 +
See [[PXELINUX#Filename_syntax]] for other possible notations.
 +
  
 
=== Distinct directory symlink path ===
 
=== Distinct directory symlink path ===
Line 66: Line 232:
 
would allow the {{nowrap|"''boot/vmlinuz''"}} reference  
 
would allow the {{nowrap|"''boot/vmlinuz''"}} reference  
 
to be resolved to the {{nowrap|"''/tftproot/boot/vmlinuz''"}} file  
 
to be resolved to the {{nowrap|"''/tftproot/boot/vmlinuz''"}} file  
by the underlying system whose current directory is {{nowrap|"''/tftproot/bios/''"}}.
+
by the underlying system whose current working directory is {{nowrap|"''/tftproot/bios/''"}}.
  
 
Some tftpds may also provide for a virtual path option that would work in a similar fashion.
 
Some tftpds may also provide for a virtual path option that would work in a similar fashion.
 +
 +
Example:
 +
<pre>
 +
/tftproot/
 +
          |_ boot/
 +
          |      |_ vmlinuz
 +
          |      |_ ...
 +
          |
 +
          |_ bios/
 +
          |      |_ boot  -> /tftproot/boot/
 +
          |      |_ pxelinux.0
 +
          |      |_ ldlinux.c32
 +
          |      |_ default
 +
          |      |_ (bios)*.c32
 +
          |      |_ ...
 +
          |
 +
          |_ efi32/
 +
          |      |_ boot  -> /tftproot/boot/
 +
          |      |_ syslinux.efi
 +
          |      |_ ldlinux.e32
 +
          |      |_ default
 +
          |      |_ (efi32)*.c32
 +
          |      |_ ...
 +
          |
 +
          |_ efi64/
 +
          |      |_ boot  -> /tftproot/boot/
 +
          |      |_ syslinux.efi
 +
          |      |_ ldlinux.e64
 +
          |      |_ default
 +
          |      |_ (efi64)*.c32
 +
          |      |_ ...
 +
          |
 +
          |_ ...
 +
</pre>
 +
<pre>
 +
default:
 +
  UI vesamenu.c32
 +
  DEFAULT mylabel
 +
  LABEL mylabel
 +
  KERNEL boot/vmlinuz
 +
</pre>
 +
 +
A KERNEL directive such as {{nowrap|"''KERNEL boot/vmlinuz''"}}
 +
in fact points to "'':<nowiki/>:boot/vmlinuz''" by means of the symlinks.
 +
  
 
=== Distinct directory symlink file ===
 
=== Distinct directory symlink file ===
 +
 +
Note: The ''paths and file names'' used in this section are examples only, and are not to be interpreted verbatim.
 +
 +
Example for BIOS clients: <br/>
  
 
When the {{nowrap|"''/tftproot/boot/vmlinuz''"}} file exists,  
 
When the {{nowrap|"''/tftproot/boot/vmlinuz''"}} file exists,  
Line 77: Line 292:
 
targeting "''../../boot/vmlinuz''"  
 
targeting "''../../boot/vmlinuz''"  
 
would be resolved to the {{nowrap|"''/tftproot/boot/vmlinuz''"}} file.
 
would be resolved to the {{nowrap|"''/tftproot/boot/vmlinuz''"}} file.
 +
 +
Example:
 +
<pre>
 +
/tftproot/
 +
          |_ boot/
 +
          |      |_ vmlinuz
 +
          |      |_ ...
 +
          |
 +
          |_ bios/
 +
          |      |_ boot/
 +
          |      |      |_ vmlinuz  -> /tftproot/boot/vmlinuz
 +
          |      |      |_ ...
 +
          |      |
 +
          |      |_ pxelinux.0
 +
          |      |_ ldlinux.c32
 +
          |      |_ default
 +
          |      |_ (bios)*.c32
 +
          |      |_ ...
 +
          |
 +
          |_ efi32/
 +
          |      |_ boot/
 +
          |      |      |_ vmlinuz  -> /tftproot/boot/vmlinuz
 +
          |      |      |_ ...
 +
          |      |
 +
          |      |_ syslinux.efi
 +
          |      |_ ldlinux.e32
 +
          |      |_ default
 +
          |      |_ (efi32)*.c32
 +
          |      |_ ...
 +
          |
 +
          |_ efi64/
 +
          |      |_ boot/
 +
          |      |      |_ vmlinuz  -> /tftproot/boot/vmlinuz
 +
          |      |      |_ ...
 +
          |      |
 +
          |      |_ syslinux.efi
 +
          |      |_ ldlinux.e64
 +
          |      |_ default
 +
          |      |_ (efi64)*.c32
 +
          |      |_ ...
 +
          |
 +
          |_ ...
 +
</pre>
 +
<pre>
 +
default:
 +
  UI vesamenu.c32
 +
  DEFAULT mylabel
 +
  LABEL mylabel
 +
  KERNEL boot/vmlinuz
 +
</pre>
 +
 +
A KERNEL directive such as {{nowrap|"''KERNEL boot/vmlinuz''"}}
 +
in fact points to "'':<nowiki/>:boot/vmlinuz''" by means of the symlinks.

Revision as of 09:57, 18 December 2014

Placing respective boot loader files for multiple firmware architectures (BIOS, EFI IA32 and EFI X64) into one common TFTP root, requires careful attention:

  • each boot loader file will search for the same configuration files; and,
  • c32 modules, although identically named, come in distinct incompatible architectures.

Several techniques can allow all three architectures to boot. This applies to Syslinux version 6.00 and greater (introduction of EFI32/EFI64 to Syslinux).

Common config no COM32

In this setup, you either can not use any COM32 modules or must not attempt to execute the foreign-architecture COM32 modules. This setup eliminates any use of (vesa)menu.c32.

Place the following files in the same location:

  • pxelinux.0 together with ldlinux.c32 (BIOS); and,
  • syslinux.efi (efi32/efi/syslinux.efi renamed uniquely, e.g. as syslnx32.efi or bootia32.efi) together with ldlinux.e32 (EFI IA32); and,
  • syslinux.efi (efi64/efi/syslinux.efi renamed uniquely, e.g. as syslnx64.efi or bootx64.efi) together with ldlinux.e64 (EFI X64).

Example:

 default:
  DEFAULT mylabel
  LABEL mylabel
  KERNEL boot/vmlinuz
  INITRD boot/initrd
  APPEND myoptions
  SYSAPPEND bitmask

Instead of the KERNEL directive, an alternative KERNEL-LIKE directive could be used when appropriate.

Common directory distinct config

In this setup, COM32 modules can be fully utilized. However, this setup depends on the effective use of DHCP option 209, either by:

  • feeding the network booting client DHCP option 209, either by:
    • encapsulating within vendor-options (DHCP option 43); or,
    • forcibly inserting it into the offer/acknowledgment, as it is not requested by default; or by,
  • built-in options, coded into the booting pxelinux.0/syslinux.efi binary by means of the pxelinux-options tool. In this case, clients running the same binary would use a single config.

Each architecture should be configured to utilize a respective configuration file that includes a PATH statement to an architecture-specific directory for c32 modules. The PATH directive always assumes absolute paths in its argument.

The Working Directory can be changed by means of the CONFIG directive. In-common configuration files can be INCLUDEed. For either directive, adequate relative paths are especially important in this setup.

Relative paths are based on the Current Working Directory. The initial Working Directory is either:

  • the tftproot; or,
  • the parent directory of the bootloader file; or,
  • set by dhcp option 210 (pathprefix); or,
  • hardcoded by the pxelinux-options tool.

For the following example, the bios.cfg file is the default configuration file for BIOS clients; the efi32.cfg file is the default configuration file for EFI IA32 clients; the efi64.cfg file is the default configuration file for EFI X64 clients.

 /tftproot/
          |_ boot/
          |      |_ vmlinuz
          |      |_ initrd
          |      |_ splash.png
          |      |_ ...
          |
          |_ bios.cfg
          |_ efi32.cfg
          |_ ef64.cfg
          |_ pxelinux.0
          |_ ldlinux.c32
          |_ bootia32.efi
          |_ ldlinux.e32
          |_ bootx64.efi
          |_ ldlinux.e64
          |_ ...
          |
          |_ bios/
          |      |_ (bios)*.c32
          |      |_ ...
          |
          |_ efi32/
          |       |_ (efi32)*.c32
          |       |_ ...
          |
          |_ efi64/
          |       |_ (efi32)*.c32
          |       |_ ...
          |_ ...
 bios.cfg:
  PATH bios
  UI bios/vesamenu.c32
  INCLUDE common.cfg

 efi32.cfg:
  PATH efi32
  UI efi32/vesamenu.c32
  INCLUDE common.cfg

 efi64.cfg:
  PATH efi64
  UI efi64/vesamenu.c32
  INCLUDE common.cfg

 common.cfg:
  #
  # When the in-common config is INCLUDEed in this setup, then
  # there should be no references to c32 modules in it.
  #
  MENU BACKGROUND boot/splash.png
  DEFAULT mylabel
  LABEL mylabel
  KERNEL boot/vmlinuz

See also:

Distinct directory

In this setup, each client's architecture boots to a respective working directory containing its own configs and its own c32 modules. File reuse can be achieved by one of several other techniques that may depend on the particular TFTP system's capabilities (e.g. symlinks). For example, BIOS clients will load "bios/pxelinux.0", EFI32 clients will load "efi32/syslinux.efi" and EFI64 clients will load "efi64/syslinux.efi". This setup allows all architectures to use their full capabilities.

Example:

 default:
  UI vesamenu.c32
  DEFAULT mylabel
  LABEL mylabel
  KERNEL vmlinuz

When booting with "/tftproot/bios/pxelinux.0", the Current Working Directory is "/tftproot/bios/".

When booting with "/tftproot/efi32/syslinux.efi", the Current Working Directory is "/tftproot/efi32/".

When booting with "/tftproot/efi64/syslinux.efi", the Current Working Directory is "/tftproot/efi64/".


Distinct directory common kernel path

Note: The paths and file names used in this section are examples only, and are not to be interpreted verbatim.

When referencing a kernel file (e.g. vmlinuz), reference a common path. For example:

  • "::boot/vmlinuz" - TFTP path to current TFTP server starting in its root; or,
  • "http://192.0.2.3/boot/vmlinuz" - using a system capable of HTTP transfer, provided by:
    • pxelinux.0 atop gPXE/iPXE with HTTP support; or,
    • lpxelinux.0; and/or,
    • syslinux.efi.

Try to avoid using "../" notation, as it does not strip a directory but rather adds another part to the path that the TFTP server must then interpret, which one hopes it would be effective (but it is often not).

Example:

 /tftproot/
          |_ boot/
          |      |_ vmlinuz
          |      |_ ...
          |
          |_ bios/
          |      |_ pxelinux.0
          |      |_ ldlinux.c32
          |      |_ default
          |      |_ (bios)*.c32
          |      |_ ...
          |
          |_ efi32/
          |       |_ boot/
          |       |      |_ vmlinuz
          |       |      |_ ...
          |       |
          |       |_ syslinux.efi
          |       |_ ldlinux.e32
          |       |_ default
          |       |_ (efi32)*.c32
          |       |_ ...
          |
          |_ efi64/
          |       |_ syslinux.efi
          |       |_ ldlinux.e64
          |       |_ default
          |       |_ (efi64)*.c32
          |       |_ ...
          |
          |_ ...
 default:
  UI vesamenu.c32
  DEFAULT mylabel
  LABEL mylabel
  KERNEL ::boot/vmlinuz

The double colon symbol ("::") is an absolute path to the tftproot. See PXELINUX#Filename_syntax for other possible notations.


Distinct directory symlink path

Note: The paths and file names used in this section are examples only, and are not to be interpreted verbatim.

Presuming that the tftpd can resolve directory paths' symlinks, depending perhaps on a chroot...

Example for BIOS clients:

When the "boot/vmlinuz" kernel file exists, creating a symlink at "bios/boot/" targeting "../boot" or "/tftproot/boot" would allow the "boot/vmlinuz" reference to be resolved to the "/tftproot/boot/vmlinuz" file by the underlying system whose current working directory is "/tftproot/bios/".

Some tftpds may also provide for a virtual path option that would work in a similar fashion.

Example:

 /tftproot/
          |_ boot/
          |      |_ vmlinuz
          |      |_ ...
          |
          |_ bios/
          |      |_ boot  -> /tftproot/boot/
          |      |_ pxelinux.0
          |      |_ ldlinux.c32
          |      |_ default
          |      |_ (bios)*.c32
          |      |_ ...
          |
          |_ efi32/
          |       |_ boot  -> /tftproot/boot/
          |       |_ syslinux.efi
          |       |_ ldlinux.e32
          |       |_ default
          |       |_ (efi32)*.c32
          |       |_ ...
          |
          |_ efi64/
          |       |_ boot  -> /tftproot/boot/
          |       |_ syslinux.efi
          |       |_ ldlinux.e64
          |       |_ default
          |       |_ (efi64)*.c32
          |       |_ ...
          |
          |_ ...
 default:
  UI vesamenu.c32
  DEFAULT mylabel
  LABEL mylabel
  KERNEL boot/vmlinuz

A KERNEL directive such as "KERNEL boot/vmlinuz" in fact points to "::boot/vmlinuz" by means of the symlinks.


Distinct directory symlink file

Note: The paths and file names used in this section are examples only, and are not to be interpreted verbatim.

Example for BIOS clients:

When the "/tftproot/boot/vmlinuz" file exists, creating a "vmlinuz" symlink in the "/tftproot/bios/boot/" directory targeting "../../boot/vmlinuz" would be resolved to the "/tftproot/boot/vmlinuz" file.

Example:

 /tftproot/
          |_ boot/
          |      |_ vmlinuz
          |      |_ ...
          |
          |_ bios/
          |      |_ boot/
          |      |      |_ vmlinuz  -> /tftproot/boot/vmlinuz
          |      |      |_ ...
          |      |
          |      |_ pxelinux.0
          |      |_ ldlinux.c32
          |      |_ default
          |      |_ (bios)*.c32
          |      |_ ...
          |
          |_ efi32/
          |       |_ boot/
          |       |      |_ vmlinuz  -> /tftproot/boot/vmlinuz
          |       |      |_ ...
          |       |
          |       |_ syslinux.efi
          |       |_ ldlinux.e32
          |       |_ default
          |       |_ (efi32)*.c32
          |       |_ ...
          |
          |_ efi64/
          |       |_ boot/
          |       |      |_ vmlinuz  -> /tftproot/boot/vmlinuz
          |       |      |_ ...
          |       |
          |       |_ syslinux.efi
          |       |_ ldlinux.e64
          |       |_ default
          |       |_ (efi64)*.c32
          |       |_ ...
          |
          |_ ...
 default:
  UI vesamenu.c32
  DEFAULT mylabel
  LABEL mylabel
  KERNEL boot/vmlinuz

A KERNEL directive such as "KERNEL boot/vmlinuz" in fact points to "::boot/vmlinuz" by means of the symlinks.