调用自定义函数导致UEFI应用崩溃问题求助
问题分析与解决方案
核心问题
你的UEFI程序崩溃主要源于两个关键错误:
1. 未编译并链接自定义函数的实现文件
构建脚本仅处理了main.c,完全忽略了conversion.c的编译与链接。这会导致程序运行时调用ui64str时跳转到无效内存地址,直接触发崩溃。
2. 代码中的数组赋值逻辑错误
- main.c中的非法赋值:
CONVSTRING(numstr) = L"00000000000000000000";不符合C语法,数组变量无法直接用字符串字面量赋值。 - conversion.c中的无效操作:
string = L"00000000000000000000";仅修改了函数内部的指针变量,根本没有修改传入的目标数组内容。
修复步骤
1. 修正代码
修改后的main.c
#include "gnu-efi/inc/efi.h" #include "gnu-efi/inc/efilib.h" #include <inttypes.h> #include "conversion.h" EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) { InitializeLib(ImageHandle, SystemTable); CONVSTRING(numstr); // 使用UEFI提供的Unicode字符串复制函数完成初始化 UnicodeStrCpy(numstr, L"00000000000000000000"); ui64str(numstr, 5); Print(L"Hello, world!\n"); Print(numstr); Print(L"\n"); return EFI_SUCCESS; }
修改后的conversion.c
#include <inttypes.h> #include "gnu-efi/inc/efi.h" #include "gnu-efi/inc/efilib.h" // 引入Unicode字符串操作函数 #include "conversion.h" void ui64str(CHAR16* string, uint64_t number) { // 将内容复制到传入的目标数组,而非修改指针 UnicodeStrCpy(string, L"00000000000000000000"); return; }
2. 更新构建脚本
加入conversion.c的编译步骤,并在链接时引入其目标文件:
:: 编译conversion.c gcc conversion.c \ -c \ -fno-stack-protector \ -fpic \ -fshort-wchar \ -mno-red-zone \ -I gnu-efi/inc \ -I gnu-efi/inc/x86_64 \ -I . \ -DEFI_FUNCTION_WRAPPER \ -o tmp/conversion.o :: 编译main.c gcc main.c \ -c \ -fno-stack-protector \ -fpic \ -fshort-wchar \ -mno-red-zone \ -I gnu-efi/inc \ -I gnu-efi/inc/x86_64 \ -I . \ -DEFI_FUNCTION_WRAPPER \ -o tmp/main.o :: 链接时加入conversion.o ld tmp/main.o \ tmp/conversion.o \ gnu-efi/x86_64/gnuefi/crt0-efi-x86_64.o \ -nostdlib \ -znocombreloc \ -T gnu-efi/gnuefi/elf_x86_64_efi.lds \ -shared \ -Bsymbolic \ -L gnu-efi/lib \ gnu-efi/x86_64/gnuefi/libgnuefi.a \ gnu-efi/x86_64/lib/libefi.a \ -o tmp/main.so :: 生成EFI可执行文件 objcopy -j .text \ -j .sdata \ -j .data \ -j .dynamic \ -j .dynsym \ -j .rel \ -j .rela \ -j .reloc \ --target=efi-app-x86_64 \ tmp/main.so \ output/BOOTX64.EFI
额外说明
- UEFI环境下禁止使用标准C库字符串函数,必须使用
efilib.h提供的Unicode系列函数(如UnicodeStrCpy)。 - 所有自定义实现的源文件必须被编译并加入链接流程,否则会出现符号未定义导致运行时崩溃。
内容的提问来源于stack exchange,提问作者usernameisunavaible
相关产品推荐
相关产品推荐

