Patrick Williams | 92b42cb | 2022-09-03 06:53:57 -0500 | [diff] [blame^] | 1 | From cb4349edce6ce360436f10da8b6aa32e68fb778d Mon Sep 17 00:00:00 2001 |
| 2 | From: Jerome Forissier <jerome.forissier@linaro.org> |
| 3 | Date: Tue, 23 Aug 2022 11:41:00 +0000 |
| 4 | Subject: [PATCH] core, ldelf: link: add -z execstack |
| 5 | |
| 6 | When building for arm32 with GNU binutils 2.39, the linker outputs |
| 7 | warnings when generating some TEE core binaries (all_obj.o, init.o, |
| 8 | unpaged.o and tee.elf) as well as ldelf.elf: |
| 9 | |
| 10 | arm-poky-linux-gnueabi-ld.bfd: warning: atomic_a32.o: missing .note.GNU-stack section implies executable stack |
| 11 | arm-poky-linux-gnueabi-ld.bfd: NOTE: This behaviour is deprecated and will be removed in a future version of the linker |
| 12 | |
| 13 | The permissions used when mapping the TEE core stacks do not depend on |
| 14 | any metadata found in the ELF file. Similarly when the TEE core loads |
| 15 | ldelf it already creates a non-executable stack regardless of ELF |
| 16 | information. Therefore we can safely ignore the warnings. This is done |
| 17 | by adding the '-z execstack' option. |
| 18 | |
| 19 | Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org> |
| 20 | |
| 21 | Signed-off-by: Anton Antonov <Anton.Antonov@arm.com> |
| 22 | Upstream-Status: Backport [https://github.com/OP-TEE/optee_os/pull/5499] |
| 23 | |
| 24 | --- |
| 25 | core/arch/arm/kernel/link.mk | 13 +++++++++---- |
| 26 | ldelf/link.mk | 4 ++++ |
| 27 | 2 files changed, 13 insertions(+), 4 deletions(-) |
| 28 | |
| 29 | diff --git a/core/arch/arm/kernel/link.mk b/core/arch/arm/kernel/link.mk |
| 30 | index 3dc459d6..85cde58e 100644 |
| 31 | --- a/core/arch/arm/kernel/link.mk |
| 32 | +++ b/core/arch/arm/kernel/link.mk |
| 33 | @@ -9,6 +9,11 @@ link-script-dep = $(link-out-dir)/.kern.ld.d |
| 34 | |
| 35 | AWK = awk |
| 36 | |
| 37 | +link-ldflags-common += $(call ld-option,--no-warn-rwx-segments) |
| 38 | +ifeq ($(CFG_ARM32_core),y) |
| 39 | +link-ldflags-common += $(call ld-option,--no-warn-execstack) |
| 40 | +endif |
| 41 | + |
| 42 | link-ldflags = $(LDFLAGS) |
| 43 | ifeq ($(CFG_CORE_ASLR),y) |
| 44 | link-ldflags += -pie -Bsymbolic -z notext -z norelro $(ldflag-apply-dynamic-relocs) |
| 45 | @@ -17,7 +22,7 @@ link-ldflags += -T $(link-script-pp) -Map=$(link-out-dir)/tee.map |
| 46 | link-ldflags += --sort-section=alignment |
| 47 | link-ldflags += --fatal-warnings |
| 48 | link-ldflags += --gc-sections |
| 49 | -link-ldflags += $(call ld-option,--no-warn-rwx-segments) |
| 50 | +link-ldflags += $(link-ldflags-common) |
| 51 | |
| 52 | link-ldadd = $(LDADD) |
| 53 | link-ldadd += $(ldflags-external) |
| 54 | @@ -39,7 +44,7 @@ link-script-cppflags := \ |
| 55 | $(cppflagscore)) |
| 56 | |
| 57 | ldargs-all_objs := -T $(link-script-dummy) --no-check-sections \ |
| 58 | - $(call ld-option,--no-warn-rwx-segments) \ |
| 59 | + $(link-ldflags-common) \ |
| 60 | $(link-objs) $(link-ldadd) $(libgcccore) |
| 61 | cleanfiles += $(link-out-dir)/all_objs.o |
| 62 | $(link-out-dir)/all_objs.o: $(objs) $(libdeps) $(MAKEFILE_LIST) |
| 63 | @@ -53,7 +58,7 @@ $(link-out-dir)/unpaged_entries.txt: $(link-out-dir)/all_objs.o |
| 64 | $(AWK) '/ ____keep_pager/ { printf "-u%s ", $$3 }' > $@ |
| 65 | |
| 66 | unpaged-ldargs := -T $(link-script-dummy) --no-check-sections --gc-sections \ |
| 67 | - $(call ld-option,--no-warn-rwx-segments) |
| 68 | + $(link-ldflags-common) |
| 69 | unpaged-ldadd := $(objs) $(link-ldadd) $(libgcccore) |
| 70 | cleanfiles += $(link-out-dir)/unpaged.o |
| 71 | $(link-out-dir)/unpaged.o: $(link-out-dir)/unpaged_entries.txt |
| 72 | @@ -82,7 +87,7 @@ $(link-out-dir)/init_entries.txt: $(link-out-dir)/all_objs.o |
| 73 | $(AWK) '/ ____keep_init/ { printf "-u%s ", $$3 }' > $@ |
| 74 | |
| 75 | init-ldargs := -T $(link-script-dummy) --no-check-sections --gc-sections \ |
| 76 | - $(call ld-option,--no-warn-rwx-segments) |
| 77 | + $(link-ldflags-common) |
| 78 | init-ldadd := $(link-objs-init) $(link-out-dir)/version.o $(link-ldadd) \ |
| 79 | $(libgcccore) |
| 80 | cleanfiles += $(link-out-dir)/init.o |
| 81 | diff --git a/ldelf/link.mk b/ldelf/link.mk |
| 82 | index 8fafc879..d8a05ea6 100644 |
| 83 | --- a/ldelf/link.mk |
| 84 | +++ b/ldelf/link.mk |
| 85 | @@ -19,6 +19,10 @@ link-ldflags += --sort-section=alignment |
| 86 | link-ldflags += -z max-page-size=4096 # OP-TEE always uses 4K alignment |
| 87 | link-ldflags += $(link-ldflags$(sm)) |
| 88 | |
| 89 | +ifeq ($(CFG_ARM32_$(sm)), y) |
| 90 | +link-ldflags += $(call ld-option,--no-warn-execstack) |
| 91 | +endif |
| 92 | + |
| 93 | link-ldadd = $(addprefix -L,$(libdirs)) |
| 94 | link-ldadd += --start-group $(addprefix -l,$(libnames)) --end-group |
| 95 | ldargs-ldelf.elf := $(link-ldflags) $(objs) $(link-ldadd) $(libgcc$(sm)) |