Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ix86 and ARM32 MacOS (embedded ELF) CI/CD #38

Merged
merged 6 commits into from
Jul 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 21 additions & 4 deletions .github/workflows/macos-gcc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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-
Expand All @@ -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:
Expand All @@ -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
Expand All @@ -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
Expand Down
19 changes: 16 additions & 3 deletions Make.defaults
Original file line number Diff line number Diff line change
Expand Up @@ -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" ] \
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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 \
Expand Down
2 changes: 2 additions & 0 deletions Make.rules
Original file line number Diff line number Diff line change
Expand Up @@ -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 $@)"
Expand Down
4 changes: 2 additions & 2 deletions gnuefi/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)
Expand Down
176 changes: 176 additions & 0 deletions gnuefi/crt0-efi-ia32-local.S
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions gnuefi/elf_aarch64_efi.lds
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ SECTIONS
KEEP (*(.reloc))
}
. = ALIGN(4096);
_DYNAMIC = .;
.dynamic : { *(.dynamic) }
. = ALIGN(4096);
.data :
Expand Down
1 change: 1 addition & 0 deletions gnuefi/elf_aarch64_efi_local.lds
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ SECTIONS
_reloc_size = _ereloc - _reloc;
. = ALIGN(4096);
_data = .;
_DYNAMIC = .;
.dynamic : { *(.dynamic) }
. = ALIGN(4096);
.data :
Expand Down
1 change: 1 addition & 0 deletions gnuefi/elf_arm_efi.lds
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ SECTIONS
_reloc_size = _ereloc - _reloc;
. = ALIGN(4096);
_data = .;
_DYNAMIC = .;
.dynamic : { *(.dynamic) }
. = ALIGN(4096);
.data :
Expand Down
1 change: 1 addition & 0 deletions gnuefi/elf_ia32_efi.lds
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ SECTIONS
.note.gnu.build-id : { *(.note.gnu.build-id) }

. = ALIGN(4096);
_DYNAMIC = .;
.dynamic : { *(.dynamic) }
. = ALIGN(4096);
.rel :
Expand Down
Loading