首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法编译GNU-EFI程序

无法编译GNU-EFI程序
EN

Stack Overflow用户
提问于 2019-11-26 12:57:32
回答 2查看 1.5K关注 0票数 2

为了研究UEFI问题,我遵循了一个教程:当我尝试编译时,我得到了这个我不明白的

代码语言:javascript
复制
ERROR:`hello.c: In function ‘efi_main’:
hello.c:8:10: warning: passing argument 1 of ‘Print’ from incompatible pointer type [-Wincompatible-pointer-types]
    Print(L"Hi,,,");
          ^~~~~~~~
In file included from hello.c:2:0:
/usr/local/include/efi/efilib.h:503:1: note: expected ‘const CHAR16 * {aka const short unsigned int *}’ but argument is of type ‘int *’
 Print (
 ^~~~~
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
/tmp/ccGlbBgD.o: In function `efi_main':
hello.c:(.text+0x1f): undefined reference to `InitializeLib'
hello.c:(.text+0x30): undefined reference to `Print'
collect2: error: ld returned 1 exit status`

教程网址:"https://www.rodsbooks.com/efi-programming/hello.html

顺便说一句,我对C编程很陌生

编辑:我尝试了gcc版本7.4.0和5.5.0来编译程序,并通过"sudo -efi“安装了gnu-efi,并从教程中对代码进行了更改,这里是代码

代码语言:javascript
复制
#include <efi/efi.h>
#include <efi/efilib.h>
EFI_STATUS
EFIAPI
efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
    InitializeLib(ImageHandle, SystemTable);
    Print(L"Hi,,,");
    return EFI_SUCCESS;
}

我试过的命令

GCC v7.4.0gcc hello.c -I /usr/include/efi/x86_64

GCC v5.5.0gcc-5 hello.c -I /usr/include/efi/x86_64

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-26 13:44:21

出现此错误是因为您没有使用编译efi程序时应该有的编译器选项。显示的错误来自缺少-fshort-wchar选项。未定义的引用来自于不针对efi库进行链接。undefined reference to 'main'来自于不使用-shared编译选项。

您链接的站点显示了如何编译程序的示例makefile。该站点还简要解释了用于编译程序的一些编译标志。最简单的方法就是使用makefile。跟着它编译efi程序。

其他方法是手动从makefile中提取编译和链接器标志,并使用适当的编译选项进行编译。

票数 3
EN

Stack Overflow用户

发布于 2019-11-27 11:19:22

经过一番艰苦的研究,我的EFI程序开始工作了,但我没有使用"Makefile“,而是手动完成了。

使用的命令:

代码语言:javascript
复制
gcc main.c -c -fno-stack-protector -fPIC -fshort-wchar -mno-red-zone -I /usr/include/efi -I /usr/include/efi/x86_64 -DEFI_FUNCTION_WRAPPER -o main.o
ld main.o /usr/lib/crt0-efi-x86_64.o -nostdlib -znocombreloc -T /usr/lib/elf_x86_64_efi.lds -shared -Bsymbolic -L /usr/lib -l:libgnuefi.a -l:libefi.a -o main.so
objcopy -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel -j .rela -j .reloc --target=efi-app-x86_64 main.so main.efi
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59051517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档