C语言 为什么我的hello world安装程序无法正确构建?

wz1wpwve  于 2024-01-06  发布在  其他
关注(0)|答案(1)|浏览(97)

我似乎无法取得进展;我的程序无法运行,错误消息是无意义的。一个十六进制转储显示一个错误的PE二进制文件,没有明显的原因:
我从this tutorial开始
我的Makefile

  1. ARCH=x86_64
  2. OBJS=hello.o
  3. TARGET=hello.efi
  4. EFIINC=/usr/include/efi
  5. EFIINCS=-I$(EFIINC) -I$(EIFFINC)/$(ARCH) -I$(EFIINC)/protocol
  6. LIB=/usr/lib64
  7. EFILIB=/usr/lib
  8. EFI_CRT_OJBS=$(EFILIB)/crt0-efi-$(ARCH).o
  9. EFI_LDS=$(EFILIB)/elf_$(ARCH)_efi.lds
  10. CFLAGS=$(EFIINCS) -fno-stack-protector -fpic -fshort-wchar -mno-red-zone -Wall -DEFI_FUNCION_WRAPPER
  11. LDFLAGS =-nostdlib -znocombreloc -T $(EFI_LDS) -shared -Bsymbolic -L $(EFILIB) -L $(LIB) $(EFI_CRT_OBJS)
  12. all: $(TARGET)
  13. hello.so: $(OBJS)
  14. ld $(LDFLAGS) $(OBJS) -o $@ -lefi -lgnuefi
  15. %.efi: %.so
  16. objcopy -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j rel -j rela -j reloc --target=efi-app-$(ARCH) $^ $@

字符串
我的hello.c

  1. #include <efi.h>
  2. #include <efilib.h>
  3. EFI_STATUS EFIAPI efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
  4. {
  5. InitializeLib(ImageHandle, SystemTable);
  6. Print(L"Hello, World\n");
  7. return EFI_SUCCESS;
  8. }


我构建,复制hello.efi到磁盘映像,并启动qemu:
qemu-system-x86_64 -enable-kvm -bios /usr/share/qemu/OVMF.fd -nodefaults -display gtk -vga std -hda target
但在尝试运行它时:

  1. FS0:\> dir
  2. Directory of: FS0:\
  3. 12/31/2023 48,181 exit.efi
  4. 12/31/2023 41,494 hello.efi
  5. FS0:\> hello.efi
  6. Command Error Status: Unsupported


exit.efi是efi library中的一个股票演示应用程序;它启动了。我不确定它是否应该挂断qemu,但它确实做了一些事情。我的应用程序是hello.efi。它没有启动。
运行objdump以确保文件格式正确:

  1. $ objdump -f -h hello.efi
  2. hello.efi: file format pei-x86-64
  3. architecture: i386:x86-64, flags 0x00000030:
  4. HAS_SYMS, HAS_LOCALS
  5. start address 0x0000000000000000
  6. Sections:
  7. Idx Name Size VMA LMA File off Algn
  8. 0 .text 00005bf0 0000000000003000 0000000000003000 00000138 2**4
  9. CONTENTS, ALLOC, LOAD, READONLY, CODE
  10. 1 .data 00001d00 0000000000009000 0000000000009000 00005d38 2**5
  11. CONTENTS, ALLOC, LOAD, DATA
  12. 2 .dynamic 00000110 000000000000b000 000000000000b000 00007b38 2**3
  13. CONTENTS, ALLOC, LOAD, DATA
  14. 3 .dynsym 000000d8 000000000000d000 000000000000d000 00007d38 2**3
  15. CONTENTS, ALLOC, LOAD, READONLY, DATA


编译和主机环境是debian 12.4 x86_64。
编译过程中出现了严重的错误。二进制文件顶部的十六进制转储给出:

  1. $ hexdump -C hello.efi | head -n 16
  2. 00000000 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00 |MZ..........ÿÿ..|
  3. 00000010 b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 |¸.......@.......|
  4. 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
  5. 00000030 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 |................|
  6. 00000040 0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68 |..º..´.Í!¸.LÍ!Th|
  7. 00000050 69 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f |is program canno|
  8. 00000060 74 20 62 65 20 72 75 6e 20 69 6e 20 44 4f 53 20 |t be run in DOS |
  9. 00000070 6d 6f 64 65 2e 0d 0d 0a 24 00 00 00 00 00 00 00 |mode....$.......|
  10. 00000080 50 45 00 00 64 86 04 00 00 00 00 00 38 7f 00 00 |PE..d.......8...|
  11. 00000090 12 01 00 00 00 00 05 02 2e 74 65 78 74 00 00 00 |.........text...|
  12. 000000a0 f0 5b 00 00 00 30 00 00 00 5c 00 00 38 01 00 00 |ð[...0...\..8...|
  13. 000000b0 00 00 00 00 00 00 00 00 00 00 00 00 20 00 50 60 |............ .P`|
  14. 000000c0 2e 64 61 74 61 00 00 00 00 1d 00 00 00 90 00 00 |.data...........|
  15. 000000d0 00 1e 00 00 38 5d 00 00 00 00 00 00 00 00 00 00 |....8]..........|
  16. 000000e0 00 00 00 00 40 00 60 c0 2e 64 79 6e 61 6d 69 63 |....@.`À.dynamic|
  17. 000000f0 10 01 00 00 00 b0 00 00 00 02 00 00 38 7b 00 00 |.....°......8{..|


节头开始太靠近PE签名。该二进制文件将被解密。

n8ghc7c1

n8ghc7c11#

你的Makefile中有一些错别字:

  • EFIINCS=-I$(EFIINC)-I$(EIFINC)/$(EFIINC)-I$(EFIINC)/方案
    *EFILIB_CRT_OJBS=$(EFILIB)/crt0-efi-$(EFILIB).o
  • objcopy -j .text -j .sdata -j .data -j .dynamic -j .dynsym -jrel-jrela-j reloc --target=efi-app-$(xml)$^ $@

我让你的代码运行这个Makefile:

  1. ARCH=x86_64
  2. OBJS=hello.o
  3. TARGET=hello.efi
  4. EFIINC=/usr/include/efi
  5. EFIINCS=-I$(EFIINC) -I$(EFIINC)/$(ARCH) -I$(EFIINC)/protocol
  6. LIB=/usr/lib64
  7. EFILIB=/usr/lib
  8. EFI_CRT_OBJS=$(EFILIB)/crt0-efi-$(ARCH).o
  9. EFI_LDS=$(EFILIB)/elf_$(ARCH)_efi.lds
  10. CFLAGS=$(EFIINCS) -fpic -ffreestanding -fno-stack-protector -fno-stack-check -fshort-wchar -mno-red-zone -maccumulate-outgoing-args -Wall -DEFI_FUNCION_WRAPPER
  11. LDFLAGS=-shared -Bsymbolic -T $(EFI_LDS) -L $(EFILIB) -L $(LIB) $(EFI_CRT_OBJS)
  12. all: $(TARGET)
  13. hello.so: $(OBJS)
  14. ld $(LDFLAGS) $(OBJS) -o $@ -lgnuefi -lefi
  15. %.efi: %.so
  16. objcopy -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel -j .rela -j .rel.* -j .rela.* -j .reloc --target=efi-app-$(ARCH) --subsystem=10 $^ $@

字符串

展开查看全部

相关问题