Fix RISCV64 not setting the subsystem according to EFI_SUBSYSTEM
The RISCV64 toolchain does not support 16-bit variable relocation from assembly, and even if it did support relocations, it would not properly set the subsystem from --defsym. So we add an extra step on RISCV64, post objcopy, to set the field manually (using dd and /bin/echo to output the relevant byte, as GNU Make's echo does not support -ne). Closes ncroxon/gnu-efi#27. Signed-off-by: Pete Batard <pete@akeo.ie>
This commit is contained in:
parent
5d0de491f1
commit
eeb0e6a830
@ -36,12 +36,17 @@
|
||||
|
||||
.SECONDARY:
|
||||
|
||||
CHAR_SUBSYSTEM=$(subst 0x,\x,$(SUBSYSTEM))
|
||||
|
||||
ifeq ($(IS_MINGW32),)
|
||||
%.efi: %.so
|
||||
@$(ECHO) " OBJCOPY $(notdir $@)"
|
||||
$(HIDE)$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .rodata -j .rel \
|
||||
-j .rela -j .rel.* -j .rela.* -j .rel* -j .rela* \
|
||||
-j .areloc -j .reloc $(FORMAT) $*.so $@
|
||||
ifeq ($(ARCH),riscv64)
|
||||
$(HIDE)/bin/echo -ne "$(CHAR_SUBSYSTEM)" | dd of=$@ bs=1 seek=156 count=1 conv=notrunc status=none
|
||||
endif
|
||||
|
||||
%.efi.debug: %.so
|
||||
@$(ECHO) " OBJCOPY $(notdir $@)"
|
||||
|
@ -16,10 +16,6 @@
|
||||
* either version 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef EFI_SUBSYSTEM
|
||||
#define EFI_SUBSYSTEM 10
|
||||
#endif
|
||||
|
||||
.section .text.head
|
||||
|
||||
/*
|
||||
@ -71,7 +67,7 @@ extra_header_fields:
|
||||
// Everything before the kernel image is considered part of the header
|
||||
.4byte _text - ImageBase // SizeOfHeaders
|
||||
.4byte 0 // CheckSum
|
||||
.2byte EFI_SUBSYSTEM // Subsystem
|
||||
.2byte 0 // Subsystem
|
||||
.2byte 0 // DllCharacteristics
|
||||
.8byte 0 // SizeOfStackReserve
|
||||
.8byte 0 // SizeOfStackCommit
|
||||
|
Loading…
Reference in New Issue
Block a user