UEFI App Bare Bones: Difference between revisions
[unchecked revision] | [unchecked revision] |
Content deleted Content added
Changed FAT32 instructions to use mtools |
m Bot: Replace deprecated source tag with syntaxhighlight |
||
(45 intermediate revisions by 18 users not shown) | |||
Line 1:
{{BeginnersWarning}}
{{Rating|2}}
In this tutorial,
This tutorial uses the header files and GUID definitions from the [
== Prerequisites ==
To build the EFI filesystem image, developers can use [[MTools]] or [https://github.com/jncronin/mkgpt '''mkgpt'''] to create a hard disk image. To build a CD image, '''xorriso''' (in [[mkisofs]] emulation mode) will be needed. To run under an emulator, it is best to use '''qemu-system-x86_64''' coupled with the [http://tianocore.sourceforge.net/wiki/OVMF '''x64 OVMF firmware'''].
Under an apt-based system (e.g. Debian/Ubuntu) you can run <source lang="bash">sudo apt-get install qemu binutils-mingw-w64 gcc-mingw-w64 xorriso mtools▼
▲Under an apt-based system (e.g. Debian/Ubuntu),
To install mkgpt you can run these commands:<syntaxhighlight lang="bash">git clone https://github.com/jncronin/mkgpt.git
cd mkgpt
automake --add-missing
autoreconf
./configure
make
sudo make install</syntaxhighlight>
== Testing the emulator ==
Line 20 ⟶ 28:
Now is a good time to check the emulator is working successfully with the OVMF firmware.
<
== Preparing the files ==
=== hello.c ===
<
#include <efilib.h>
Line 37 ⟶ 47:
/* Say hi */
Status = ST->ConOut->OutputString(ST->ConOut, L"Hello World
if (EFI_ERROR(Status))
return Status;
Line 56 ⟶ 66:
return Status;
}</
=== gnu-efi/lib/data.c ===
=== gnu-efi/lib/lib.h ===
data.c includes this file. It
== Building ==
To build,
<syntaxhighlight lang="bash">
<source lang="bash">x86_64-w64-mingw32-gcc -ffreestanding -Ipath/to/gnu-efi/inc -Ipath/to/gnu-efi/inc/x86_64 -Ipath/to/gnu-efi/protocol -c -o hello.o hello.c▼
# compile: (flags before -o become CFLAGS in the Makefile)
x86_64-w64-mingw32-gcc -ffreestanding -Ipath/to/gnu-efi/inc -Ipath/to/gnu-efi/inc/x86_64 -Ipath/to/gnu-efi/protocol -c -o data.o path/to/gnu-efi/lib/data.c▼
▲
x86_64-w64-mingw32-gcc -nostdlib -Wl,-dll -shared -Wl,--subsystem,10 -e efi_main -o BOOTX64.EFI hello.o data.o -lgcc</source>Note here that '--subsystem 10' specifies an EFI application.▼
▲x86_64-w64-mingw32-gcc -ffreestanding -Ipath/to/gnu-efi/inc -Ipath/to/gnu-efi/inc/x86_64 -Ipath/to/gnu-efi/inc/protocol -c -o data.o path/to/gnu-efi/lib/data.c
# link: (flags before -o become LDFLAGS in the Makefile)
▲x86_64-w64-mingw32-gcc -nostdlib -Wl,-dll -shared -Wl,--subsystem,10 -e efi_main -o BOOTX64.EFI hello.o data.o
</syntaxhighlight>
Note here that '--subsystem 10' specifies an EFI application for ld.
=== Under LLVM/clang ===
The build sequence under LLVM/clang is essentially the same, although there is the advantage of having ''all'' targets installed by default:
<syntaxhighlight lang="bash">
CFLAGS='-target x86_64-unknown-windows
-ffreestanding
-fshort-wchar
-mno-red-zone
-Ipath/to/gnu-efi/inc -Ipath/to/gnu-efi/inc/x86_64 -Ipath/to/gnu-efi/inc/protocol'
LDFLAGS='-target x86_64-unknown-windows
-nostdlib
-Wl,-entry:efi_main
-Wl,-subsystem:efi_application
-fuse-ld=lld-link'
clang $CFLAGS -c -o hello.o hello.c
clang $CFLAGS -c -o data.o path/to/gnu-efi/lib/data.c
clang $LDFLAGS -o BOOTX64.EFI hello.o data.o
</syntaxhighlight>
Passing '--target x86_64-unknown-windows' to clang tells it to compile for x86_64 "Windows". This is quite not the same as 64-bit UEFI PE yet, but as before the "freestanding" part makes it a good kernel image. An example of this toolchain is found in the [https://github.com/c-util/c-efi c-efi] project.
Note the '-mno-red-zone' part used here as well -- it is a [https://stackoverflow.com/questions/25787408/why-cant-kernel-code-use-a-red-zone bad idea] to use a red zone for kernel code if interrupts are to be implemented. It should be done with GCC as well, but read [[Libgcc without red zone]] for the extra work needed to be done.
== Creating the FAT image ==
{{Main|Bootable Disk}}
Next,
<syntaxhighlight lang="bash">
mformat -i fat.img -f 1440 ::
mmd -i fat.img ::/EFI
mmd -i fat.img ::/EFI/BOOT
mcopy -i fat.img BOOTX64.EFI ::/EFI/BOOT
</syntaxhighlight>
=== Running as a USB stick image ===
<
=== Creating and running the HD image ===
Line 94 ⟶ 133:
The HD image is a disk image in the [[GPT]] format, with the FAT image specially identified as a 'EFI System Partition'.
<
qemu-system-x86_64 -L OVMF_dir/ -
=== Creating and running the CD image ===
The
<
cp fat.img iso
xorriso -as mkisofs -R -f -e fat.img -no-emul-boot -o cdimage.iso iso
qemu-system-x86_64 -L OVMF_dir/ -
== What to do next? ==
There is also a finished app bare bone which supports both Linux and Windows (Visual Studio), see [https://github.com/pbatard/uefi-simple uefi-simple].
== Common problems ==
Some UEFI hardware implementations require that the FAT image is in the FAT32 format (rather than FAT12 or FAT16).
== See also ==
* [[UEFI]]
* [[UEFI ISO Bare Bones]]
* [[GNU-EFI]]
* [[POSIX-UEFI]]
[[Category:Bare bones tutorials]]
[[Category:Firmware]]
[[Category:UEFI]]
|