diff --git a/.github/workflows/macos-gcc.yml b/.github/workflows/macos-gcc.yml index cb20100..8e47f23 100644 --- a/.github/workflows/macos-gcc.yml +++ b/.github/workflows/macos-gcc.yml @@ -8,8 +8,12 @@ jobs: strategy: matrix: - arch: [x64, aa64] + arch: [ia32, x64, aa64, arm] include: + - arch: ia32 + dir: ia32 + cross_compile: i686-elf- + toolchain: i686-elf-gcc - arch: x64 dir: x86_64 cross_compile: x86_64-elf- @@ -18,7 +22,10 @@ jobs: dir: aarch64 cross_compile: aarch64-elf- toolchain: aarch64-elf-gcc - + - arch: arm + dir: arm + cross_compile: arm-none-eabi- + toolchain: arm-none-eabi-gcc steps: @@ -33,7 +40,7 @@ jobs: - name: Build run: | - make ARCH=${{ matrix.arch }} CROSS_COMPILE=${{ matrix.cross_compile }} USING_APPLE=1 + make ARCH=${{ matrix.arch }} CROSS_COMPILE=${{ matrix.cross_compile }} - name: Generate binary information run: ${{ matrix.cross_compile }}readelf -a ./${{ matrix.dir }}/apps/ctors_dtors_priority_test.so > ./${{ matrix.dir }}/apps/readelf.txt @@ -51,18 +58,28 @@ jobs: strategy: matrix: - arch: [x64, aa64] + arch: [ia32, x64, aa64, arm] include: - arch: x64 pkg: qemu-system-x86 qemu_arch: x86_64 qemu_opts: -M q35 fw_base: OVMF + - arch: ia32 + pkg: qemu-system-x86 + qemu_arch: i386 + qemu_opts: -M pc + fw_base: OVMF - arch: aa64 pkg: qemu-system-arm qemu_arch: aarch64 qemu_opts: -M virt -cpu cortex-a57 fw_base: AAVMF + - arch: arm + pkg: qemu-system-arm + qemu_arch: arm + qemu_opts: -M virt -cpu cortex-a15 + fw_base: AAVMF steps: - name: Set up Linux environment diff --git a/Make.defaults b/Make.defaults index 7ef3ea2..c08bea4 100755 --- a/Make.defaults +++ b/Make.defaults @@ -110,7 +110,7 @@ endif GCCVERSION := $(shell $(CC) -dumpversion | sed -e 's/-win32/.0/' | cut -f1 -d.) GCCMINOR := $(shell $(CC) -dumpversion | sed -e 's/-win32/.0/' | cut -f2 -d.) USING_CLANG := $(shell $(CC) -v 2>&1 | grep -q 'clang version' && echo clang || echo 0) -USING_APPLE ?= 0 +USING_APPLE ?= $(shell uname -s | grep -q 'Darwin' && echo 1 || echo 0) # Rely on GCC MS ABI support? GCCNEWENOUGH := $(shell ( [ $(GCCVERSION) -gt "4" ] \ @@ -206,6 +206,12 @@ export SYSTEM_HAS_EFI_OBJCOPY ?= 0 endif endif +ifeq ($(ARCH),ia32) +ifeq ($(USING_APPLE),1) +export SYSTEM_HAS_EFI_OBJCOPY ?= 0 +endif +endif + ifeq ($(HAVE_EFI_OBJCOPY),y) export SYSTEM_HAS_EFI_OBJCOPY ?= 1 else @@ -255,6 +261,13 @@ ifeq ($(USING_CLANG),clang) CFLAGS += -gdwarf-4 endif +# Force hard float (for library mismatch) +ifeq ($(ARCH),arm) +ifeq ($(USING_APPLE),1) +CFLAGS += -mfloat-abi=hard -mfpu=vfpv2 +endif +endif + ifeq ($(V),1) ARFLAGS := rDv else @@ -264,9 +277,9 @@ ASFLAGS += $(ARCH3264) LDFLAGS += -nostdlib ifeq ($(IS_MINGW32),) LDFLAGS += --warn-common --no-undefined --fatal-warnings \ - --build-id=sha1 -z nocombreloc + --build-id=sha1 ifeq ($(USING_APPLE),0) - LDFLAGS += -z norelro + LDFLAGS += -z norelro -z nocombreloc endif else LDFLAGS += -Wl,--warn-common -Wl,--no-undefined -Wl,--fatal-warnings \ diff --git a/Make.rules b/Make.rules index e92d65f..d8de119 100644 --- a/Make.rules +++ b/Make.rules @@ -45,8 +45,10 @@ ifeq ($(IS_MINGW32),) -j .rela -j .rel.* -j .rela.* -j .rel* -j .rela* \ -j .areloc -j .reloc $(FORMAT) $*.so $@ ifeq ($(ARCH),riscv64) +ifeq ($(SYSTEM_HAS_EFI_OBJCOPY),0) $(HIDE)/bin/echo -ne "$(CHAR_SUBSYSTEM)" | dd of=$@ bs=1 seek=156 count=1 conv=notrunc status=none endif +endif %.efi.debug: %.so @$(ECHO) " OBJCOPY $(notdir $@)" diff --git a/gnuefi/Makefile b/gnuefi/Makefile index c84b889..89da83a 100644 --- a/gnuefi/Makefile +++ b/gnuefi/Makefile @@ -80,7 +80,7 @@ endif # on aarch64, avoid jump tables before all relocations have been processed reloc_aarch64.o: CFLAGS += -fno-jump-tables -ifneq (,$(filter $(ARCH),aarch64 riscv64)) +ifneq (,$(filter $(ARCH),aarch64 riscv64 ia32)) CRT0_LOCAL_TARGET = crt0-efi-$(ARCH)-local.o endif @@ -116,7 +116,7 @@ ifneq (,$(findstring FreeBSD,$(OS))) ifeq ($(ARCH),x86_64) $(INSTALL) -m 644 $(SRCDIR)/elf_$(ARCH)_fbsd_efi.lds $(INSTALLROOT)$(LIBDIR) else - ifneq (,$(filter $(ARCH),aarch64 riscv64)) + ifneq (,$(filter $(ARCH),aarch64 riscv64 ia32)) $(INSTALL) -m 644 $(SRCDIR)/elf_$(ARCH)_efi_local.lds $(INSTALLROOT)$(LIBDIR) endif $(INSTALL) -m 644 $(SRCDIR)/elf_$(ARCH)_efi.lds $(INSTALLROOT)$(LIBDIR) diff --git a/gnuefi/crt0-efi-ia32-local.S b/gnuefi/crt0-efi-ia32-local.S new file mode 100644 index 0000000..8b562ab --- /dev/null +++ b/gnuefi/crt0-efi-ia32-local.S @@ -0,0 +1,176 @@ +.section .text.head + + /* + * Magic "MZ" signature for PE/COFF + */ + .globl ImageBase +ImageBase: + .ascii "MZ" + .skip 58 // 'MZ' + pad + offset == 64 + .4byte pe_header - ImageBase // Offset to the PE header. +pe_header: + .ascii "PE" + .2byte 0 +coff_header: + .2byte 0x14c // i386+ + .2byte 4 // nr_sections + .4byte 0 // TimeDateStamp + .4byte 0 // PointerToSymbolTable + .4byte 0 // NumberOfSymbols + .2byte section_table - optional_header // SizeOfOptionalHeader + .2byte 0x306 // Characteristics. + // IMAGE_FILE_32BIT_MACHINE | + // IMAGE_FILE_DEBUG_STRIPPED | + // IMAGE_FILE_EXECUTABLE_IMAGE | + // IMAGE_FILE_LINE_NUMS_STRIPPED +optional_header: + .2byte 0x10b // PE32+ format + .byte 0x02 // MajorLinkerVersion + .byte 0x14 // MinorLinkerVersion + .4byte _etext - _start // SizeOfCode + .4byte _alldata_size - ImageBase // SizeOfInitializedData + .4byte 0 // SizeOfUninitializedData + .4byte _start - ImageBase // AddressOfEntryPoint + .4byte _start - ImageBase // BaseOfCode + .4byte _reloc - ImageBase // BaseOfData + +extra_header_fields: + .4byte 0 // ImageBase + .4byte 0x1000 // SectionAlignment + .4byte 0x1000 // FileAlignment + .2byte 0 // MajorOperatingSystemVersion + .2byte 0 // MinorOperatingSystemVersion + .2byte 0 // MajorImageVersion + .2byte 0 // MinorImageVersion + .2byte 0 // MajorSubsystemVersion + .2byte 0 // MinorSubsystemVersion + .4byte 0 // Win32VersionValue + + .4byte _image_end - ImageBase // SizeOfImage + + // Everything before the kernel image is considered part of the header + .4byte _start - ImageBase // SizeOfHeaders + .4byte 0 // CheckSum + .2byte EFI_SUBSYSTEM // Subsystem + .2byte 0 // DllCharacteristics + .4byte 0 // SizeOfStackReserve + .4byte 0 // SizeOfStackCommit + .4byte 0 // SizeOfHeapReserve + .4byte 0 // SizeOfHeapCommit + .4byte 0 // LoaderFlags + .4byte 0x10 // NumberOfRvaAndSizes + + .8byte 0 // ExportTable + .8byte 0 // ImportTable + .8byte 0 // ResourceTable + .8byte 0 // ExceptionTable + .8byte 0 // CertificationTable + .4byte _reloc - ImageBase // BaseRelocationTable (VirtualAddress) + .4byte _reloc_vsize - ImageBase // BaseRelocationTable (Size) + .8byte 0 // Debug + .8byte 0 // Architecture + .8byte 0 // Global Ptr + .8byte 0 // TLS Table + .8byte 0 // Load Config Table + .8byte 0 // Bound Import + .8byte 0 // IAT + .8byte 0 // Delay Import Descriptor + .8byte 0 // CLR Runtime Header + .8byte 0 // Reserved, must be zero + + // Section table +section_table: + + .ascii ".text\0\0\0" + .4byte _evtext - _start // VirtualSize + .4byte _start - ImageBase // VirtualAddress + .4byte _etext - _start // SizeOfRawData + .4byte _start - ImageBase // PointerToRawData + .4byte 0 // PointerToRelocations (0 for executables) + .4byte 0 // PointerToLineNumbers (0 for executables) + .2byte 0 // NumberOfRelocations (0 for executables) + .2byte 0 // NumberOfLineNumbers (0 for executables) + .4byte 0x60000020 // Characteristics (section flags) + + /* + * The EFI application loader requires a relocation section + * because EFI applications must be relocatable. This is a + * dummy section as far as we are concerned. + */ + .ascii ".reloc\0\0" + .4byte _reloc_vsize - ImageBase // VirtualSize + .4byte _reloc - ImageBase // VirtualAddress + .4byte _reloc_size - ImageBase // SizeOfRawData + .4byte _reloc - ImageBase // PointerToRawData + .4byte 0 // PointerToRelocations + .4byte 0 // PointerToLineNumbers + .2byte 0 // NumberOfRelocations + .2byte 0 // NumberOfLineNumbers + .4byte 0x42000040 // Characteristics (section flags) + + .ascii ".data\0\0\0" + .4byte _data_vsize - ImageBase // VirtualSize + .4byte _data - ImageBase // VirtualAddress + .4byte _data_size - ImageBase // SizeOfRawData + .4byte _data - ImageBase // PointerToRawData + .4byte 0 // PointerToRelocations + .4byte 0 // PointerToLineNumbers + .2byte 0 // NumberOfRelocations + .2byte 0 // NumberOfLineNumbers + .4byte 0xC0000040 // Characteristics (section flags) + + .ascii ".rodata\0" + .4byte _rodata_vsize - ImageBase // VirtualSize + .4byte _rodata - ImageBase // VirtualAddress + .4byte _rodata_size - ImageBase // SizeOfRawData + .4byte _rodata - ImageBase // PointerToRawData + .4byte 0 // PointerToRelocations + .4byte 0 // PointerToLineNumbers + .2byte 0 // NumberOfRelocations + .2byte 0 // NumberOfLineNumbers + .4byte 0x40000040 // Characteristics (section flags) + +.globl _start +.type _start,%function +_start: + pushl %ebp + movl %esp,%ebp + + pushl 12(%ebp) # copy "image" argument + pushl 8(%ebp) # copy "systab" argument + + call 0f +0: popl %eax + movl %eax,%ebx + + addl $ImageBase-0b,%eax # %eax = ldbase + addl $_DYNAMIC-0b,%ebx # %ebx = _DYNAMIC + + pushl %ebx # pass _DYNAMIC as second argument + pushl %eax # pass ldbase as first argument + call _relocate + popl %ebx + popl %ebx + testl %eax,%eax + jne .exit + + call _entry # call app with "image" and "systab" argument + +.exit: leave + ret + +// hand-craft a dummy .reloc section so EFI knows it's a relocatable executable: + + .data +dummy: .4byte 0 + +#define IMAGE_REL_ABSOLUTE 0 + .section .reloc + .4byte dummy // Page RVA + .4byte 12 // Block Size (2*4+2*2), must be aligned by 32 Bits + .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy + .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/gnuefi/elf_aarch64_efi.lds b/gnuefi/elf_aarch64_efi.lds index 99d01e8..3834b00 100644 --- a/gnuefi/elf_aarch64_efi.lds +++ b/gnuefi/elf_aarch64_efi.lds @@ -29,6 +29,7 @@ SECTIONS KEEP (*(.reloc)) } . = ALIGN(4096); + _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .data : diff --git a/gnuefi/elf_aarch64_efi_local.lds b/gnuefi/elf_aarch64_efi_local.lds index 86227fc..1609544 100644 --- a/gnuefi/elf_aarch64_efi_local.lds +++ b/gnuefi/elf_aarch64_efi_local.lds @@ -30,6 +30,7 @@ SECTIONS _reloc_size = _ereloc - _reloc; . = ALIGN(4096); _data = .; + _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .data : diff --git a/gnuefi/elf_arm_efi.lds b/gnuefi/elf_arm_efi.lds index cae55ea..afe17af 100644 --- a/gnuefi/elf_arm_efi.lds +++ b/gnuefi/elf_arm_efi.lds @@ -29,6 +29,7 @@ SECTIONS _reloc_size = _ereloc - _reloc; . = ALIGN(4096); _data = .; + _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .data : diff --git a/gnuefi/elf_ia32_efi.lds b/gnuefi/elf_ia32_efi.lds index 3369033..8f12905 100644 --- a/gnuefi/elf_ia32_efi.lds +++ b/gnuefi/elf_ia32_efi.lds @@ -69,6 +69,7 @@ SECTIONS .note.gnu.build-id : { *(.note.gnu.build-id) } . = ALIGN(4096); + _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .rel : diff --git a/gnuefi/elf_ia32_efi_local.lds b/gnuefi/elf_ia32_efi_local.lds new file mode 100644 index 0000000..4e0b5f1 --- /dev/null +++ b/gnuefi/elf_ia32_efi_local.lds @@ -0,0 +1,141 @@ +OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") +OUTPUT_ARCH(i386) +ENTRY(_start) +SECTIONS +{ + .text 0 : { + *(.text.head) + . = ALIGN(4096); + _text = .; + *(.text) + *(.text.*) + *(.gnu.linkonce.t.*) + *(.plt) + . = ALIGN(16); + _evtext = .; + . = ALIGN(4096); + _etext = .; + } =0 + _text_vsize = _evtext - _text; + _text_size = _etext - _text; + . = ALIGN(4096); + _reloc = .; + .reloc : { + *(.reloc) + _evreloc = .; + . = ALIGN(4096); + _ereloc = .; + } =0 + _reloc_vsize = _evreloc - _reloc; + _reloc_size = _ereloc - _reloc; + . = ALIGN(4096); + _data = .; + _DYNAMIC = .; + .dynamic : { *(.dynamic) } + . = ALIGN(4096); + .data : + { + *(.sdata) + *(.data) + *(.data1) + *(.data.*) + *(.got.plt) + *(.got) + + /* + * Note that these aren't the using the GNU "CONSTRUCTOR" output section + * command, so they don't start with a size. Because of p2align and the + * end/END definitions, and the fact that they're mergeable, they can also + * have NULLs which aren't guaranteed to be at the end. + */ + . = ALIGN(16); + __init_array_start = .; + *(SORT(.init_array.*)) + *(.init_array) + __init_array_end = .; + . = ALIGN(16); + __CTOR_LIST__ = .; + *(SORT(.ctors.*)) + *(.ctors) + __CTOR_END__ = .; + . = ALIGN(16); + __DTOR_LIST__ = .; + *(SORT(.dtors.*)) + *(.dtors) + __DTOR_END__ = .; + . = ALIGN(16); + __fini_array_start = .; + *(SORT(.fini_array.*)) + *(.fini_array) + __fini_array_end = .; + + /* the EFI loader doesn't seem to like a .bss section, so we stick + it all into .data: */ + . = ALIGN(16); + _bss = .; + *(.sbss) + *(.scommon) + *(.dynbss) + *(.bss) + *(.bss.*) + *(COMMON) + . = ALIGN(16); + _bss_end = .; + _evdata = .; + . = ALIGN(4096); + _edata = .; + } =0 + _data_vsize = _evdata - _data; + _data_size = _edata - _data; + + . = ALIGN(4096); + _rodata = .; + .rela : + { + *(.rela.text*) + *(.rela.data*) + *(.rela.got) + *(.rela.dyn) + *(.rela.stab) + *(.rela.init_array*) + *(.rela.fini_array*) + *(.rela.ctors*) + *(.rela.dtors*) + + } + . = ALIGN(4096); + .rela.plt : { *(.rela.plt) } + . = ALIGN(4096); + .rodata : { + *(.rodata*) + _evrodata = .; + . = ALIGN(4096); + _erodata = .; + } =0 + _rodata_vsize = _evrodata - _rodata; + _rodata_size = _erodata - _rodata; + _image_end = .; + _alldata_size = _image_end - _reloc; + + . = ALIGN(4096); + .dynsym : { *(.dynsym) } + . = ALIGN(4096); + .dynstr : { *(.dynstr) } + . = ALIGN(4096); + .note.gnu.build-id : { *(.note.gnu.build-id) } + . = ALIGN(4096); + .hash : { *(.hash) } + . = ALIGN(4096); + .gnu.hash : { *(.gnu.hash) } + . = ALIGN(4096); + .eh_frame : { *(.eh_frame) } + .eh_frame_hdr : { *(.eh_frame_hdr) } + . = ALIGN(4096); + .gcc_except_table : { *(.gcc_except_table*) } + /DISCARD/ : + { + *(.rela.reloc) + *(.note.GNU-stack) + } + .comment 0 : { *(.comment) } +} \ No newline at end of file diff --git a/gnuefi/elf_ia32_fbsd_efi.lds b/gnuefi/elf_ia32_fbsd_efi.lds index 650000c..4636b43 100644 --- a/gnuefi/elf_ia32_fbsd_efi.lds +++ b/gnuefi/elf_ia32_fbsd_efi.lds @@ -79,6 +79,7 @@ SECTIONS .note.gnu.build-id : { *(.note.gnu.build-id) } . = ALIGN(4096); + _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .rel : diff --git a/gnuefi/elf_ia64_efi.lds b/gnuefi/elf_ia64_efi.lds index efa6903..a7e9eeb 100644 --- a/gnuefi/elf_ia64_efi.lds +++ b/gnuefi/elf_ia64_efi.lds @@ -80,6 +80,7 @@ SECTIONS .note.gnu.build-id : { *(.note.gnu.build-id) } . = ALIGN(4096); + _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .rela : diff --git a/gnuefi/elf_loongarch64_efi.lds b/gnuefi/elf_loongarch64_efi.lds index 3789383..998f680 100644 --- a/gnuefi/elf_loongarch64_efi.lds +++ b/gnuefi/elf_loongarch64_efi.lds @@ -29,6 +29,7 @@ SECTIONS KEEP (*(.reloc)) } . = ALIGN(65536); + _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .data : diff --git a/gnuefi/elf_mips64el_efi.lds b/gnuefi/elf_mips64el_efi.lds index a0d1a5b..8e13fd3 100644 --- a/gnuefi/elf_mips64el_efi.lds +++ b/gnuefi/elf_mips64el_efi.lds @@ -15,6 +15,7 @@ SECTIONS _etext = .; _text_size = _etext - _text; . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); + _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .data : diff --git a/gnuefi/elf_riscv64_efi.lds b/gnuefi/elf_riscv64_efi.lds index 3360641..51266c1 100644 --- a/gnuefi/elf_riscv64_efi.lds +++ b/gnuefi/elf_riscv64_efi.lds @@ -31,6 +31,7 @@ SECTIONS KEEP (*(.reloc)) } . = ALIGN(4096); + _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .data : diff --git a/gnuefi/elf_riscv64_efi_local.lds b/gnuefi/elf_riscv64_efi_local.lds index c6c9df9..40465ee 100644 --- a/gnuefi/elf_riscv64_efi_local.lds +++ b/gnuefi/elf_riscv64_efi_local.lds @@ -32,6 +32,7 @@ SECTIONS _reloc_size = _ereloc - _reloc; . = ALIGN(4096); _data = .; + _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .data : diff --git a/gnuefi/elf_x86_64_efi.lds b/gnuefi/elf_x86_64_efi.lds index 4f7254a..d1e62ab 100644 --- a/gnuefi/elf_x86_64_efi.lds +++ b/gnuefi/elf_x86_64_efi.lds @@ -81,6 +81,7 @@ SECTIONS _edata = .; _data_size = _edata - _etext; . = ALIGN(4096); + _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .rela : diff --git a/gnuefi/elf_x86_64_fbsd_efi.lds b/gnuefi/elf_x86_64_fbsd_efi.lds index a0dc6c0..1ce7c3f 100644 --- a/gnuefi/elf_x86_64_fbsd_efi.lds +++ b/gnuefi/elf_x86_64_fbsd_efi.lds @@ -75,6 +75,7 @@ SECTIONS .note.gnu.build-id : { *(.note.gnu.build-id) } . = ALIGN(4096); + _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .rela : diff --git a/inc/efi.h b/inc/efi.h index cec1569..3c426c1 100644 --- a/inc/efi.h +++ b/inc/efi.h @@ -37,6 +37,10 @@ Revision History extern "C" { #endif +#if defined(__APPLE__) +#error "Mach-O toolchain isn't supported; please compile with an ELF toolchain from Homebrew" +#endif + #define EFI_FIRMWARE_VENDOR L"INTEL" #define EFI_FIRMWARE_MAJOR_REVISION 12 #define EFI_FIRMWARE_MINOR_REVISION 33 diff --git a/inc/subst/elf.h b/inc/subst/elf.h index 0e69637..f39fe96 100644 --- a/inc/subst/elf.h +++ b/inc/subst/elf.h @@ -1,5 +1,17 @@ +/* Copyright (C) 2024 GNU-EFI Contributors -#if !defined(__APPLE__) && !defined(__GNU_EFI_IS_APPLE) +This library is free software; +you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +See the GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along with this library; +if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#if !defined(__GNU_EFI_IS_APPLE) #include #else @@ -44,6 +56,9 @@ typedef struct { #define ELF64_R_TYPE(i) ((i) & 0xffffffff) #define DT_NULL 0 +#define DT_REL 17 +#define DT_RELSZ 18 +#define DT_RELENT 19 #define DT_RELA 7 #define DT_RELASZ 8 #define DT_RELAENT 9