本文是应作者格拉斯神剑要求,转载的文章。原文在:https://www.bilibili.com/opus/1049776129847590912?spm_id_from=333.1387.0.0
有兴趣的朋友可以关注他的项目。
格拉斯神剑使用Pascal(Free Pascal)语言写了一个能够将Linux下的可执行文件格式ELF转为UEFI下的可执行格式EFI的转换器(为了跨平台方便,做成了命令行程序,可以把各个UEFI所支持架构对应的ELF文件转换为对应的EFI文件(并不是x64平台下只能转换x64平台下的elf文件,而是什么架构的elf文件转换为对应架构的efi文件,如果elf是riscv的,转换为riscv上的UEFI EFI文件,这点可以直接点击或命令行执行elf2efi/elf2efi.exe可以看到),不知道这是不是第一个使用Pascal写elf2efi软件的。
当然这里的ELF文件是有要求的,要求如下:
1.转换前的ELF文件必须是static-pie(静态并且位置无关的可执行文件)(可以用-fPIE -Wl,–no-dynamic-linker(GNU C Compiler,gcc)或-k-pie -k–no-dynamic-linker(free pascal compiler,fpc)的编译选项得到)。
2.不能链接任何动态库,否则会导致转成的EFI文件在UEFI下运行失败。
3.对于x64平台,入口函数要求必须是微软ABI;对于i386平台,入口函数要求必须是cdecl(c的调用规范)。显然,对于所有UEFI支持的平台,其入口函数的参数必须符合UEFI规范(在UEFI国际论坛(UEFI.org)的开发者选项点开规范,会看到UEFI Specifications,点开版本号最高的就是,点进去搜索入口函数的定义即可)。
4.ELF文件本身不能有空指针这样运行时发生的错误,否则就会在转换的EFI文件里面出现错误并被UEFI Debugger报告显示。
5.ELF文件必须平台无关,避免链接系统相关的静态库和标准静态库(当然UEFI相关的库可以链接,但必须是静态库,不能动态库,动态库在链接时不会链接进去,会造成EFI文件运行时发生错误)
本程序既可以在gitee上面(https://gitee.com/tydqsoft/elf2efi)也可以在github上面(https://github.com/TYDQSoft/elf2efi)上面进行下载(两边都是一样的,下载最新版本Alpha v0.0.2就行,顺带附上Pascal源代码,自由开源)
顺带附上该命令行程序的截图(amd64架构windows下):

1.对UEFI支持的所有架构(总共4个,x64,aarch64,riscv64,loongarch64)的支持更加完美
2.比上一个版本有更快的转换速度
3.转换出来的efi文件一般来说比elf文件小
(以下的测试efi程序(由elf文件转换出来的efi文件)的功能仅是把屏幕的所有部分都变成黄色,当然不同架构的需要编译器编译成不同架构的二进制文件elf然后使用elf2efi转换来进行测试)(本elf2efi软件是自己用pascal写的,不是github上那个用C语言写的elf2efi)
x64转换成功可运行示意图:
