diff --git a/apps/Makefile b/apps/Makefile index 8ab83d5..3fa355d 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -82,6 +82,11 @@ LDFLAGS += --defsym=EFI_SUBSYSTEM=$(SUBSYSTEM) endif +# On some archs, binutils can have a larger max page size. All our .lds +# assume 4k however, and without this, they might end up blending .text +# and .data into the same segment, making it RWE +LDFLAGS += -z max-page-size=4096 + TARGETS = $(TARGET_APPS) $(TARGET_BSDRIVERS) $(TARGET_RTDRIVERS) all: $(TARGETS) diff --git a/apps/trivial.S b/apps/trivial.S index 40bc68f..3ec6562 100644 --- a/apps/trivial.S +++ b/apps/trivial.S @@ -41,3 +41,7 @@ _start: hello: .byte 'h',0,'e',0,'l',0,'l',0,'o',0,'\n',0,'\r',0,0,0 #endif + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/gnuefi/crt0-efi-aa64.S b/gnuefi/crt0-efi-aa64.S index a930258..bef3ac7 100644 --- a/gnuefi/crt0-efi-aa64.S +++ b/gnuefi/crt0-efi-aa64.S @@ -128,3 +128,7 @@ _start: 0: ldp x29, x30, [sp], #32 ret + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/gnuefi/crt0-efi-arm.S b/gnuefi/crt0-efi-arm.S index 04e75e9..a2a3a96 100644 --- a/gnuefi/crt0-efi-arm.S +++ b/gnuefi/crt0-efi-arm.S @@ -143,3 +143,7 @@ _start: .L_DYNAMIC: .word _DYNAMIC - . + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/gnuefi/crt0-efi-ia32.S b/gnuefi/crt0-efi-ia32.S index 031a592..9db6111 100644 --- a/gnuefi/crt0-efi-ia32.S +++ b/gnuefi/crt0-efi-ia32.S @@ -75,3 +75,7 @@ _start: .long .dummy1-.dummy0 // Page RVA .long 10 // Block Size (2*4+2) .word (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/gnuefi/crt0-efi-ia64.S b/gnuefi/crt0-efi-ia64.S index dacb4c4..222e6aa 100644 --- a/gnuefi/crt0-efi-ia64.S +++ b/gnuefi/crt0-efi-ia64.S @@ -85,3 +85,7 @@ _start_plabel: data4 12 // Block Size (2*4+2*2) data2 (IMAGE_REL_BASED_DIR64<<12) + 0 // reloc for plabel's entry point data2 (IMAGE_REL_BASED_DIR64<<12) + 8 // reloc for plabel's global pointer + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/gnuefi/crt0-efi-mips64el.S b/gnuefi/crt0-efi-mips64el.S index 5ad2503..7dd103e 100644 --- a/gnuefi/crt0-efi-mips64el.S +++ b/gnuefi/crt0-efi-mips64el.S @@ -186,3 +186,7 @@ _pc: .end _start .set pop + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/gnuefi/crt0-efi-x64.S b/gnuefi/crt0-efi-x64.S index 5c86cde..5514f3b 100644 --- a/gnuefi/crt0-efi-x64.S +++ b/gnuefi/crt0-efi-x64.S @@ -74,3 +74,6 @@ _start: .long 10 // Block Size (2*4+2) .word (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/gnuefi/elf_aa64_efi.lds b/gnuefi/elf_aa64_efi.lds index 161f5fc..7925e96 100644 --- a/gnuefi/elf_aa64_efi.lds +++ b/gnuefi/elf_aa64_efi.lds @@ -15,7 +15,6 @@ SECTIONS } _etext = .; _text_size = . - _text; - .dynamic : { *(.dynamic) } .data : ALIGN(4096) { _data = .; @@ -60,6 +59,7 @@ SECTIONS _bss_end = .; } + .dynamic : { *(.dynamic) } .rela.dyn : { *(.rela.dyn) } .rela.plt : { *(.rela.plt) } .rela.got : { *(.rela.got) } diff --git a/gnuefi/reloc_ia64.S b/gnuefi/reloc_ia64.S index 40203bf..ce2bf6a 100644 --- a/gnuefi/reloc_ia64.S +++ b/gnuefi/reloc_ia64.S @@ -225,3 +225,7 @@ apply_FPTR64: fptr_mem_base: .space MAX_FUNCTION_DESCRIPTORS*16 fptr_mem_limit: + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/inc/aa64.mk b/inc/aa64.mk index 406915e..2a8ed04 100644 --- a/inc/aa64.mk +++ b/inc/aa64.mk @@ -8,7 +8,7 @@ EFI_ARCH_3264 := EFI_ARCH_SUBSYSTEM := 0xa EFI_ARCH_CFLAGS := -mstrict-align -DPAGE_SIZE=4096 -DPAGE_SHIFT=12 -EFI_ARCH_LDFLAGS := --defsym=EFI_SUBSYSTEM=$(EFI_ARCH_SUBSYSTEM) +EFI_ARCH_LDFLAGS := --defsym=EFI_SUBSYSTEM=$(EFI_ARCH_SUBSYSTEM) -z max-page-size=4096 EFI_ARCH_FORMAT := -O binary EFI_ARCH_SUFFIX := aa64 EFI_ARCH_SUFFIX_UPPER := AA64 diff --git a/inc/aa64/efisetjmp_arch.h b/inc/aa64/efisetjmp_arch.h index 8ec3eeb..6564f25 100644 --- a/inc/aa64/efisetjmp_arch.h +++ b/inc/aa64/efisetjmp_arch.h @@ -18,6 +18,7 @@ typedef struct { UINT64 FP; UINT64 LR; UINT64 IP0; + UINT64 _pad1; /* FP regs */ UINT64 D8; diff --git a/lib/Makefile b/lib/Makefile index f0d7b9b..c23082f 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -74,6 +74,8 @@ all: libsubdirs libefi.a libsubdirs: @set -e ; for sdir in $(SUBDIRS); do mkdir -p $$sdir; done +$(OBJS): libsubdirs + libefi.a: $(OBJS) $(AR) $(ARFLAGS) $@ $^ @@ -92,5 +94,3 @@ install_compat: install $(SYMLINK) gnuefi/$(ARCH)/libefi.a $(INSTALLROOT)$(LIBDIR)/libefi.a include $(SRCDIR)/../Make.rules - -.PHONY: libsubdirs diff --git a/lib/aa64/efi_stub.S b/lib/aa64/efi_stub.S index 464eae5..f84aaf2 100644 --- a/lib/aa64/efi_stub.S +++ b/lib/aa64/efi_stub.S @@ -1 +1,5 @@ /* This stub is a stub to make the build happy */ + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/aa64/setjmp.S b/lib/aa64/setjmp.S index 46c29b1..700af78 100644 --- a/lib/aa64/setjmp.S +++ b/lib/aa64/setjmp.S @@ -58,3 +58,7 @@ longjmp: mov w0, #1 csel w0, w1, w0, ne br x30 + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/arm/div.S b/lib/arm/div.S index 71158b6..6371327 100644 --- a/lib/arm/div.S +++ b/lib/arm/div.S @@ -153,3 +153,7 @@ label1: @ What to do about division by zero? For now, just return. ASM_PFX(__aeabi_idiv0): bx r14 + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/arm/efi_stub.S b/lib/arm/efi_stub.S index 464eae5..f84aaf2 100644 --- a/lib/arm/efi_stub.S +++ b/lib/arm/efi_stub.S @@ -1 +1,5 @@ /* This stub is a stub to make the build happy */ + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/arm/ldivmod.S b/lib/arm/ldivmod.S index edbf89e..a0648cc 100644 --- a/lib/arm/ldivmod.S +++ b/lib/arm/ldivmod.S @@ -57,5 +57,6 @@ L_Test3: L_Exit: pop {r4,pc} - - +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/arm/llsl.S b/lib/arm/llsl.S index 0f5c407..d89d3df 100644 --- a/lib/arm/llsl.S +++ b/lib/arm/llsl.S @@ -39,3 +39,7 @@ ASM_PFX(__aeabi_llsl): lsl r1,r0,r3 mov r0,#0 bx lr + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/arm/llsr.S b/lib/arm/llsr.S index 432b27d..4ecf1e1 100644 --- a/lib/arm/llsr.S +++ b/lib/arm/llsr.S @@ -39,3 +39,7 @@ ASM_PFX(__aeabi_llsr): lsr r0,r1,r3 mov r1,#0 bx lr + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/arm/mullu.S b/lib/arm/mullu.S index 39b9a80..70cea2d 100644 --- a/lib/arm/mullu.S +++ b/lib/arm/mullu.S @@ -31,3 +31,7 @@ ASM_PFX(__aeabi_lmul): mla r1, r2, r1, ip mla r1, r3, lr, r1 ldmia sp!, {pc} + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/arm/setjmp.S b/lib/arm/setjmp.S index bd61a8d..24b709a 100644 --- a/lib/arm/setjmp.S +++ b/lib/arm/setjmp.S @@ -23,3 +23,7 @@ setjmp: .type longjmp, %function longjmp: ldmia r0, {r3-r12,r14} + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/arm/uldiv.S b/lib/arm/uldiv.S index f478898..d606476 100644 --- a/lib/arm/uldiv.S +++ b/lib/arm/uldiv.S @@ -264,4 +264,6 @@ ASM_PFX(_ll_div0): ASM_PFX(__aeabi_ldiv0): bx r14 - +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/ctors.S b/lib/ctors.S index 522d31b..a909b7f 100644 --- a/lib/ctors.S +++ b/lib/ctors.S @@ -41,3 +41,6 @@ _fini_array: _fini_array_end: .long 0 +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/ia32/efi_stub.S b/lib/ia32/efi_stub.S index 464eae5..f84aaf2 100644 --- a/lib/ia32/efi_stub.S +++ b/lib/ia32/efi_stub.S @@ -1 +1,5 @@ /* This stub is a stub to make the build happy */ + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/ia32/setjmp.S b/lib/ia32/setjmp.S index aa9c084..c768488 100644 --- a/lib/ia32/setjmp.S +++ b/lib/ia32/setjmp.S @@ -43,3 +43,7 @@ longjmp: movl (%edx), %ebx movl 4(%edx), %esi movl 8(%edx), %edi + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/ia64/palproc.S b/lib/ia64/palproc.S index c304a78..b778623 100644 --- a/lib/ia64/palproc.S +++ b/lib/ia64/palproc.S @@ -159,3 +159,6 @@ StackedComeBackFromPALCall: PROCEDURE_EXIT(MakeStackedPALCall) +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/ia64/setjmp.S b/lib/ia64/setjmp.S index bbb29d8..09d6862 100644 --- a/lib/ia64/setjmp.S +++ b/lib/ia64/setjmp.S @@ -197,3 +197,7 @@ _skip_flushrs: invala mov ar.rsc = r16 br.ret.sptk b0 + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/mips64el/efi_stub.S b/lib/mips64el/efi_stub.S index 464eae5..f84aaf2 100644 --- a/lib/mips64el/efi_stub.S +++ b/lib/mips64el/efi_stub.S @@ -1 +1,5 @@ /* This stub is a stub to make the build happy */ + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/mips64el/setjmp.S b/lib/mips64el/setjmp.S index 930aca4..2b60cdb 100644 --- a/lib/mips64el/setjmp.S +++ b/lib/mips64el/setjmp.S @@ -90,3 +90,7 @@ longjmp: li $v0, 1 movn $v0, $a1, $a1 jr $ra + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/x64/efi_stub.S b/lib/x64/efi_stub.S index b431255..617a1dd 100644 --- a/lib/x64/efi_stub.S +++ b/lib/x64/efi_stub.S @@ -187,3 +187,7 @@ ENTRY(efi_call10) ret #endif + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/lib/x64/setjmp.S b/lib/x64/setjmp.S index e3e5195..4ce1bb2 100644 --- a/lib/x64/setjmp.S +++ b/lib/x64/setjmp.S @@ -46,3 +46,7 @@ longjmp: cmp %rax,%rdx cmove %rcx,%rax jmp *0x38(%rdi) + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif