UEFI App Bare Bones: Difference between revisions

m
Bot: Replace deprecated source tag with syntaxhighlight
[unchecked revision][unchecked revision]
m (→‎Prerequisites: Added link to GNU-EFI page)
m (Bot: Replace deprecated source tag with syntaxhighlight)
 
(19 intermediate revisions by 7 users not shown)
Line 10:
== Prerequisites ==
 
Note that [[GNU-EFI]] prefers to use your host native compiler, and then convert the ELF to PE as a last step. Otherwise developersDevelopers will need a [[GCC Cross-Compiler]] or Clang targeting the '''x86_64-w64-mingw32''' target (for [[PE]] output), and the [https://sourceforge.net/projects/gnu-efi/ '''gnu-efi'''] package to(for compileUEFI the actual kernelheaders). IfMost theyLinux alreadydistros have a copy of LLVM/clang, it will too work as aprovide cross-compiler.compilers Tofor buildthis the EFI filesystem imagetarget, developersso canit's useusually [[MTools]]not or [https://github.com/jncronin/mkgpt '''mkgpt''']necessary to createbuild ait hard disk imageyourself. ToThis buildexample adoes CDnot image,link '''xorriso''' (inagainst [[mkisofsGNU-EFI]] emulationor mode)follow willits bebuild needed.process; To run under an emulator, it is best to use '''qemu-system-x86_64''' coupled withonly the [http://tianocore.sourceforge.net/wiki/OVMFheaders '''x64are OVMF firmware''']used.
 
Under an apt-based system (e.g. Debian/Ubuntu), developers can run <source lang="bash">sudo apt-get install qemu binutils-mingw-w64 gcc-mingw-w64 xorriso mtools
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'''].
wget http://www.tysos.org/files/efi/mkgpt-latest.tar.bz2
 
tar jxf mkgpt-latest.tar.bz2
Under an apt-based system (e.g. Debian/Ubuntu), developers can run: <sourcesyntaxhighlight lang="bash">sudo apt-get install qemu ovmf gnu-efi binutils-mingw-w64 gcc-mingw-w64 xorriso mtools</syntaxhighlight>
cd mkgpt && ./configure && make && sudo make install && cd ..</source> and then separately download OVMF and extract the OVMF.fd file somewhere, as well as gnu-efi.
 
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.
 
<sourcesyntaxhighlight lang="bash">qemu-system-x86_64 -L OVMF_dir/ -biospflash OVMF.fd</sourcesyntaxhighlight>should launch qemu and launch a UEFI shell prompt.
 
== Preparing the files ==
Line 27 ⟶ 35:
 
Next, create a file with the following:
<sourcesyntaxhighlight lang="c">#include <efi.h>
#include <efilib.h>
 
Line 58 ⟶ 66:
 
return Status;
}</sourcesyntaxhighlight>
 
=== gnu-efi/lib/data.c ===
Line 71 ⟶ 79:
 
To build, use the cross-compiler:
<sourcesyntaxhighlight lang="bash">
# 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/inc/protocol -c -o hello.o hello.c
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 -lgcc
</syntaxhighlight>
</source>
Note here that '--subsystem 10' specifies an EFI application for ld.
 
Line 83 ⟶ 91:
The build sequence under LLVM/clang is essentially the same, although there is the advantage of having ''all'' targets installed by default:
 
<sourcesyntaxhighlight lang="bash">
CFLAGS='-target x86_64-unknown-windows
-ffreestanding
Line 97 ⟶ 105:
clang $CFLAGS -c -o data.o path/to/gnu-efi/lib/data.c
clang $LDFLAGS -o BOOTX64.EFI hello.o data.o
</syntaxhighlight>
</source>
 
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.
Line 107 ⟶ 115:
 
Next, create a FAT filesystem image.
<sourcesyntaxhighlight lang="bash">
dd if=/dev/zero of=fat.img bs=1k count=1440
mformat -i fat.img -f 1440 ::
Line 113 ⟶ 121:
mmd -i fat.img ::/EFI/BOOT
mcopy -i fat.img BOOTX64.EFI ::/EFI/BOOT
</syntaxhighlight>
</source>
 
=== Running as a USB stick image ===
Line 119 ⟶ 127:
The FAT image can either be written directly to a USB stick and used in in a UEFI machine, or it can be run directly in QEMU:
 
<sourcesyntaxhighlight lang="bash">qemu-system-x86_64 -L OVMF_dir/ -biospflash OVMF.fd -usb -usbdevice disk::fat.img</sourcesyntaxhighlight>
 
=== Creating and running the HD image ===
Line 125 ⟶ 133:
The HD image is a disk image in the [[GPT]] format, with the FAT image specially identified as a 'EFI System Partition'.
 
<sourcesyntaxhighlight lang="bash">mkgpt -o hdimage.bin --image-size 4096 --part fat.img --type system
qemu-system-x86_64 -L OVMF_dir/ -biospflash OVMF.fd -hda hdimage.bin</sourcesyntaxhighlight>
 
=== Creating and running the CD image ===
The ISO image is a standard ISO9660 image which contains the FAT image as a file. A special El Torito option (-e) then points EFI aware systems to this image to be loaded. The CD image can either be burned to a CD and ran in a UEFI machine, or run directly in QEMU:
<sourcesyntaxhighlight lang="bash">mkdir iso
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/ -biospflash OVMF.fd -cdrom cdimage.iso</sourcesyntaxhighlight>
 
== What to do next? ==
 
Developers may want to try using some more of the EFI boot services, e.g., to [[Loading files under UEFI|read more files]] from the FAT image, manage memory, set up [[GOP|graphical frame buffer]] etc. (see the [http://www.uefi.org/specifications UEFI Specifications] page for further documentation of this).
 
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].
Line 150 ⟶ 158:
* [[UEFI ISO Bare Bones]]
* [[GNU-EFI]]
* [[POSIX-UEFI]]
 
[[Category:Bare bones tutorials]]