MAIN_FILE = MemtestEfi CC = gcc # Treat all warnings as errors #CFLAGS = -Werror CFLAGS += -Wall # Warnings not covered by Wall CFLAGS += -Wextra CFLAGS += -Wshadow CFLAGS += -Wdouble-promotion CFLAGS += -Wformat=2 -Wformat-truncation -Wformat-overflow CFLAGS += -Wundef # for undefined macros #CFLAGS += -Wno-array-bounds CFLAGS += -Wconversion -Wno-error=conversion CFLAGS += -Wpadded -Wno-error=padded CFLAGS += -Wno-error=unused-parameter CFLAGS += -fno-builtin CFLAGS += -ffunction-sections # Each functions gets own section. Unused sections can be culled at a final optimization # EFI requires -fshort-wchar CFLAGS += -fshort-wchar CFLAGS += -fno-common # Disabled the ability for tentative definitions to be merged into a pre-existing definition CFLAGS += -fno-strict-aliasing # EFI uses Microsoft ABI so no red zone is defined CFLAGS += -mno-red-zone # use %rip-relative addressing wherever possible?? Or not? CFLAGS += -fpie #CFLAGS += -fno-pie -no-pie -static CFLAGS += -fPIC CFLAGS += -ffunction-sections CFLAGS += -fdata-sections CFLAGS += -maccumulate-outgoing-args CFLAGS += -fno-asynchronous-unwind-tables # Don't use standard library CFLAGS += -nostdlib CFLAGS += -mcmodel=small #CFLAGS += -fno-stack-protector e M64=-m64 #-march=x86-64 M32=-m32 M=$(M64) PREPROCESSOR=-DUEFI -Os \ -D DISABLE_NEW_DEPRECATED_INTERFACES "-DEFIAPI=__attribute__((ms_abi))" OBJS=Efi_Defs.obj config.o controller.o cpuid.o display.o dmi.o error.o init.o \ lib.o logger.o main.o memory_tables.o memsize.o patn.o pci.o reloc.o \ screen_buffer.o random.o smp.o spd.o test.o vmem.o \ BaseLib.o BaseMemoryLib.o BasePrintLib.o \ UefiDebugLibStdErr.o UefiDevicePathLib2.o UefiLib2.o ApplicationEntryPoint.o \ BaseDebugPrintErrorLevelLib.o UefiMemoryAllocationLib.o BasePcdLibNull.o \ UefiRuntimeServicesTableLib.o UefiBootServicesTableLib.o MemtestEfi.obj BaseMemoryLib_OBJS=CompareMemWrapper.o CopyMem.o CopyMemWrapper.o IsZeroBufferWrapper.o \ MemLibGeneric.o MemLibGuid.o ScanMem16Wrapper.o ScanMem32Wrapper.o ScanMem64Wrapper.o \ ScanMem8Wrapper.o SetMem.o SetMem16Wrapper.o SetMem32Wrapper.o SetMem64Wrapper.o \ SetMemWrapper.o ZeroMemWrapper.o UefiDevicePathLib_OBJS=DevicePathFromText.o DevicePathToText.o DevicePathUtilities.o \ DevicePathUtilitiesDxeSmm.o DevicePathUtilitiesStandaloneMm.o UefiDevicePathLib.o \ UefiDevicePathLibOptionalDevicePathProtocol.o BaseLib_OBJS=ARShiftU64.o BitField.o CheckSum.o CpuDeadLoop.o Cpu.o DivU64x64Remainder.o \ DivU64x32Remainder.o DivU64x32.o DivS64x64Remainder.o FilePaths.o GetPowerOfTwo64.o \ GetPowerOfTwo32.o HighBitSet64.o HighBitSet32.o LongJump.o LRotU64.o LowBitSet64.o \ LowBitSet32.o LRotU32.o LShiftU64.o Math64.o ModU64x32.o MultU64x64.o MultU64x32.o MultS64x64.o \ RRotU32.o RRotU64.o RShiftU64.o SafeString.o String.o SetJump.o SwapBytes64.o SwapBytes32.o \ SwapBytes16.o SwitchStack.o Unaligned.o LIBRARIES=MemtestEfi.lib debug: CFLAGS += -g3 debug: CFLAGS += -fstack-usage # emit .su (stack usage) files for each c file you compile debug: CFLAGS += -Wstack-usage=255 debug: CFLAGS += -Werror debug: all release: #CFLAGS += -flto release: PREPROCESSOR += -DUSING_LTO release: all all: clean MemtestEfi.efi move run clean $(MAIN_FILE).efi: $(MAIN_FILE).dll ./memtest86+/efi/Include/GenFw -e UEFI_APPLICATION -o $(MAIN_FILE).efi $(MAIN_FILE).dll #objcopy --add-gnu-debuglink=MemtestEfi.debug MemtestEfi.efi # gc-sections culls unused sections $(MAIN_FILE).dll: $(MAIN_FILE).lib $(CC) $(CFLAGS) $(PREPROCESSOR) $(M) $(LIBRARIES) -o $(MAIN_FILE).dll \ -nostdlib \ -Wl,-n,-q,--gc-sections,--print-gc-sections \ -Wl,--entry,_ModuleEntryPoint \ -Wl,-Map,$(MAIN_FILE).map,--whole-archive \ -Wl,-melf_x86_64,--oformat=elf64-x86-64,-pie \ -Wl,--defsym=PECOFF_HEADER_SIZE=0x228 \ -Wl,--script=memtest86+/efi/Include/GccBase.lds \ -z common-page-size=0x40 \ -u _ModuleEntryPoint \ -DSTRING_ARRAY_NAME=${MAIN_FILE}Strings objcopy --strip-unneeded -R .eh_frame -v $(MAIN_FILE).dll $(MAIN_FILE).dll strip -R .strtab MemtestEfi.dll $(MAIN_FILE).lib: $(OBJS) gcc-ar crv $(MAIN_FILE).lib $^ #objcopy --only-keep-debug MemtestEfi.lib MemtestEfi.debug #rm $^ $(MAIN_FILE).obj: $(MAIN_FILE).c $(CC) $(CFLAGS) $(PREPROCESSOR) $(M) -o $(MAIN_FILE).obj \ -MMD -MF $(MAIN_FILE).obj.deps \ -c \ -include memtest86+/efi/Include/Efi_Defs.h \ -DSTRING_ARRAY_NAME=${MAIN_FILE}Strings \ -I . \ -I"memtest86+" \ -I"memtest86+/efi/Include" \ $(MAIN_FILE).c Efi_Defs.obj: memtest86+/efi/Include/Efi_Defs.c $(CC) $(CFLAGS) $(PREPROCESSOR) $(M) -o $@ $< \ -c \ -I"memtest86+/efi/Include" %.o: memtest86+/%.c $(CC) $(CFLAGS) $(PREPROCESSOR) $(M) -c -o $@ $< \ -I"memtest86+/efi" %.o: memtest86+/efi/Include/src/%.c $(CC) $(CFLAGS) $(PREPROCESSOR) $(M) -c -o $@ $< \ -I"memtest86+/efi/Include" \ -I"memtest86+/efi/Include/Library" %.o: memtest86+/efi/Include/src/UefiLib/%.c $(CC) $(CFLAGS) $(PREPROCESSOR) $(M) -c -o $@ $< \ -I"memtest86+/efi/Include" \ -I"memtest86+/efi/Include/Protocol" \ -I"memtest86+/efi/Include/Guid" BasePcdLibNull.o: memtest86+/efi/Include/src/PcdLib.c $(CC) $(CFLAGS) $(PREPROCESSOR) $(M) -c -o $@ $< \ -I"memtest86+/efi/Include" UefiMemoryAllocationLib.o: memtest86+/efi/Include/src/MemoryAllocationLib.c $(CC) $(CFLAGS) $(PREPROCESSOR) $(M) -c -o $@ $< \ -I"memtest86+/efi/Include" UefiLib2.o: Acpi.o Console.o UefiDriverModel.o UefiLib.o UefiLibPrint.o UefiNotTiano.o ld -r -o $@ $^ rm $^ %.o: memtest86+/efi/Include/src/UefiDebugLibStdErr/%.c $(CC) $(CFLAGS) $(PREPROCESSOR) $(M) -c -o $@ $< \ -I"memtest86+/efi/Include" UefiDebugLibStdErr.o: DebugLib.o DebugLibConstructor.o ld -r -o $@ $^ rm $^ %.o: memtest86+/efi/Include/src/BaseMemoryLib/%.c $(CC) $(CFLAGS) $(PREPROCESSOR) $(M) -c -o $@ $< \ -I"memtest86+/efi/Include" BaseMemoryLib.o: $(BaseMemoryLib_OBJS) ld -r -o $@ $^ rm $^ %.o: memtest86+/efi/Include/src/BasePrintLib/%.c $(CC) $(CFLAGS) $(PREPROCESSOR) $(M) -c -o $@ $< \ -I"memtest86+/efi/Include" BasePrintLib.o: PrintLib.o PrintLibInternal.o ld -r -o $@ $^ rm $^ %.o: memtest86+/efi/Include/src/UefiDevicePathLib/%.c $(CC) $(CFLAGS) $(PREPROCESSOR) $(M) -c -o $@ $< \ -I"memtest86+/efi/Include" UefiDevicePathLib2.o: $(UefiDevicePathLib_OBJS) ld -r -o $@ $^ rm $^ %.o: memtest86+/efi/Include/src/BaseLib/%.c $(CC) $(CFLAGS) $(PREPROCESSOR) $(M) -c -o $@ $< \ -I"memtest86+/efi/Include" BaseLib.o: $(BaseLib_OBJS) ld -r -o $@ $^ rm $^ %.o: memtest86+/efi/%.c $(CC) $(CFLAGS) $(PREPROCESSOR) $(M) -c -o $@ $< \ -I"memtest86+" \ -I"memtest86+/efi" \ -I"memtest86+/efi/Include" clean: rm -f memtest86+/*.o rm -f *.o rm -f MemtestEfi.obj rm -f MemtestEfi.map rm -f MemtestEfi.dll rm -f MemtestEfi.efi rm -f MemtestEfi.txt rm -f Efi_Defs.obj rm -f MemtestEfi.lib rm -f MemtestEfi.obj.deps rm -f *.debug move: cp MemtestEfi.efi ../test_code/hda-contents run: (cd ../test_code; sudo ./run.sh)