You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用自定义函数导致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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:14:57