From patchwork Thu Nov 28 15:43:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 845948 Delivered-To: patch@linaro.org Received: by 2002:adf:f2c4:0:b0:382:43a8:7b94 with SMTP id d4csp315857wrp; Thu, 28 Nov 2024 07:50:38 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCXYncd1Z27E7WJiX6m8y8f1VQx6sDLHP8Cn1zsUBaJIyg0VYqmUITlSspJ1N/iqkvVpRd8dQg==@linaro.org X-Google-Smtp-Source: AGHT+IHYS3fYdOzDMHx2+EXzjfDkfyP28ZPvtS+xoK6CcEmrjVAfGiwUt7F0R/n7B8jJaizfq+PP X-Received: by 2002:a05:6122:2a0f:b0:515:3bfb:d41f with SMTP id 71dfb90a1353d-515569aa357mr9692941e0c.3.1732809037860; Thu, 28 Nov 2024 07:50:37 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1732809037; cv=pass; d=google.com; s=arc-20240605; b=kyyz0/ja+H7A/5sJ/E+X/j/XMY1KZyzrhz/Xf9Ql1swAfhfMwZ9rmgUFO0m8tyZMBi NNwVv7hBvIfyqkuVtlHrDwNYiLDm5rcYIvDcApEnHFzitBvHUeORTDpWRQ9H7XrmW8ak eHOUB65pAJvQ0vWWb+l8mZzQz8VnAQVTSfEvM7b7ddqs+zmNAaL8i1qB6+lEIb1OQ3xB Wb5H+bjLKrpFzHykH+svxki+682CbchBt7ptvcfZ8+I7ZlWKx+CsTZDyvjdJJUfWiraJ jYG4eRiSpJIOOHKgh9lFjEOZJ33fItP0lF86cdNTUisq0dZZYrRSWC2QMCUX5hb9f16V j8Mw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature:dkim-filter:arc-filter:dmarc-filter :delivered-to:dkim-filter; bh=zytNuzdnWEj6i7ZY5bt0r31CO9pU5KRWoNu/TjRWwQA=; fh=JruiOR+n5wiv4jZbtXJYp9lJ8UkedxUHyGOCC37Fjus=; b=KLSJhsfRl+31b2GpC5sOOHoGmbn/9XHdCiooLwnoCS5pfXeMStorPN6cOCdkg23rwF b7+n4MSMzH5u7yNdf25FlLyVYUe0vpI4OTUt7zIIBSXtFVo0UW6mZySY0bC/mHpeWrd0 hfK+jtp+gXrAmKbKragcNfjVx/JNWekzA7uIW2FnoO6caNpEqGQJCdLpo10YtqEGda3T vF7tWugRNvZPqqcJTFqj4Lj6hcXOu13PVwPxJn0xiroEVYuKmObwn4J03L/jgR37C+JI 6ivPTDeOASIZ59bQIC8+N2mI2miO2Bi6LN4bt3FjwSzCQMJWidVevAPTTUyM4ukg4ubI k0Og==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=A3QMmzfl; arc=pass (i=1); spf=pass (google.com: domain of binutils-bounces~patch=linaro.org@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces~patch=linaro.org@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id 71dfb90a1353d-5156d10d803si707575e0c.196.2024.11.28.07.50.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 Nov 2024 07:50:37 -0800 (PST) Received-SPF: pass (google.com: domain of binutils-bounces~patch=linaro.org@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=A3QMmzfl; arc=pass (i=1); spf=pass (google.com: domain of binutils-bounces~patch=linaro.org@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces~patch=linaro.org@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 574DE3858C60 for ; Thu, 28 Nov 2024 15:50:37 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 574DE3858C60 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256 header.s=google header.b=A3QMmzfl X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pf1-x443.google.com (mail-pf1-x443.google.com [IPv6:2607:f8b0:4864:20::443]) by sourceware.org (Postfix) with ESMTPS id 189133858D29 for ; Thu, 28 Nov 2024 15:45:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 189133858D29 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linaro.org ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 189133858D29 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::443 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1732808721; cv=none; b=wxwaYRfq1p3iY7wUZraKDFppsrbZFA9uv03TDU4wd4anNXmyN7GyKJ2vd3qNn+wDlutFmBBY6IytDgKV7wmQ8BHm39C05GbOt7sDn69hmvwoNHuaosKza4iTTKbDJp+Z+VEEiIpsUhZjJKP5Zj1ohiFcYjieU0FcGAVJvbt2Vow= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1732808721; c=relaxed/simple; bh=FmYdhK0GYB3Rral1oOqJUG5SIB544ETBmwD6ZXLGXVU=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=Nkys5gEq9lcs1aMBXoow7dLYN4bqlY1RhaMLvJmVhkdSRaMamN/D4EyDYCEDa4qDDOMmg2Cy0XhVbFYeMhb5KoZhfHJRAcXDnCm0B7nMnXO+i3ISigpEtwMD8dnPFfN0/eC3AFSZK9D3DU9eFv/1Rm0J+jYnI7W/GVAhYUcHPjk= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 189133858D29 Received: by mail-pf1-x443.google.com with SMTP id d2e1a72fcca58-724f42c1c38so889794b3a.1 for ; Thu, 28 Nov 2024 07:45:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1732808720; x=1733413520; darn=sourceware.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zytNuzdnWEj6i7ZY5bt0r31CO9pU5KRWoNu/TjRWwQA=; b=A3QMmzflPC0XtvBAxDrsla4nqSGC9duGiDlwDqC9ouSzMYnyCxUBBi/KW+GEB1oklV NoGKx+iMp7/AUolpzn16JJ1mhOdFAxNI7USzVBVyE78ZYiN3Uq7PJ7DjM2eatpw547Gg h1m9ozrdIOz2ofl8BY31r4znRijfYxnM5Ol2yL8iP3lz3J2XtQgyxg9VOwDbMNG5M96B 4G/3pWEl2K1xRqJhlj0CJb95O0URec6lSoFwl1pD41m7s7stXNaqnsb/AzcKpQGqwCbR TnR+/K2Z1GvAm2DerC+xiETvyHMOA/mxOE0WeH7q8Wl0dJqAag8pgmY/dSs9jndI2Eqy 5F/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732808720; x=1733413520; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zytNuzdnWEj6i7ZY5bt0r31CO9pU5KRWoNu/TjRWwQA=; b=ks9RiNuQmNfAZVG+0sB+EhXUNRTfMYiUAgL+4OrJKP4tMrtR0GSteBTn5QRHWjq0T7 QX8TOJzsDoG6BfjHLFtE6DWwBvSeS018u5hokx78ZKrB75oOnyfBOjl5zXqFgH2Qs2PI +gwk7oYIilBGAnIIb8ZJvBkdYV8fWDjoow9taKnFAHd4IuHzQcy0oDHPXv4A8JzvU0ot Te5NvaVqehgnsEv3F/JgzkKBf3PYB4I3UMYKsuCCSVOYR+wbChtX17xoOz4GtDRChMQo IR9zlh3FN6xhbm/f1/CfHEdWQ8ybixyqmKdQk4Wvb7fQazouMxow1eBLb+C9mjzJFMYy 2qYw== X-Gm-Message-State: AOJu0YzxtvoIDI/WMNbXNMNISAjFb4N2brh+ZJzn4j3A7kyll42n8cs1 UQlIsHkCT++vm3kWKjwu+UUm1A7eB1M76KB6Jl/enuxYyfIpDjtvTasD25HTAVJKV9SZ5L9Aq9b 1TM6tN4ww X-Gm-Gg: ASbGnctzmRdGaiP0Z3SDeFo1BYxMCOFlj4JC64YckS5i5uhhwVD2bnjDUiuBlmv9uF7 NwD6BlFt8abnZbMDm9a9r4dg+mkI4JkzfRW426qwxXu+EiASPpp2Q6eImWVAAhOG5HrWvttlzLh dzzg/Q2gHfNfrte4MmevnT1j56p1+wCp+d7ooDHyCjqTCGFV07MNvetw5A5MGIlH6DnLXsz36qg yusyrRaq2n4kbKcrG1U+tLrgfrlucDlLR9NnBRy66KH+9WC8syNG3Vrp83cVDM= X-Received: by 2002:a17:902:e844:b0:20f:aee9:d8b8 with SMTP id d9443c01a7336-21501096f07mr83968725ad.20.1732808719692; Thu, 28 Nov 2024 07:45:19 -0800 (PST) Received: from mandiga.. ([2804:1b3:a7c1:68c8:2c85:3a76:728e:ead2]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-21521985773sm14877405ad.199.2024.11.28.07.45.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 Nov 2024 07:45:19 -0800 (PST) From: Adhemerval Zanella To: binutils@sourceware.org Cc: Jeff Xu , "H . J . Lu" Subject: [PATCH v4 2/3] gold: Add GNU_PROPERTY_MEMORY_SEAL gnu property Date: Thu, 28 Nov 2024 12:43:20 -0300 Message-ID: <20241128154511.564500-3-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241128154511.564500-1-adhemerval.zanella@linaro.org> References: <20241128154511.564500-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces~patch=linaro.org@sourceware.org Similar to the ld.bfd, with the -z,memory-seal and -z,no-memory-seal which adds the .gnu.attribute GNU_PROPERTY_MEMORY_SEAL. Change-Id: I31e194479912d3f468d5e5132a6eb566ed9aca78 --- elfcpp/elfcpp.h | 1 + gold/NEWS | 3 ++ gold/layout.cc | 4 +++ gold/options.h | 3 ++ gold/testsuite/Makefile.am | 19 ++++++++++++ gold/testsuite/Makefile.in | 26 +++++++++++++++-- gold/testsuite/memory_seal_main.c | 5 ++++ gold/testsuite/memory_seal_shared.c | 7 +++++ gold/testsuite/memory_seal_test.sh | 45 +++++++++++++++++++++++++++++ 9 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 gold/testsuite/memory_seal_main.c create mode 100644 gold/testsuite/memory_seal_shared.c create mode 100755 gold/testsuite/memory_seal_test.sh diff --git a/elfcpp/elfcpp.h b/elfcpp/elfcpp.h index f2fe7330f7c..94cfdbfc448 100644 --- a/elfcpp/elfcpp.h +++ b/elfcpp/elfcpp.h @@ -1023,6 +1023,7 @@ enum { GNU_PROPERTY_STACK_SIZE = 1, GNU_PROPERTY_NO_COPY_ON_PROTECTED = 2, + GNU_PROPERTY_MEMORY_SEAL = 3, GNU_PROPERTY_LOPROC = 0xc0000000, GNU_PROPERTY_X86_COMPAT_ISA_1_USED = 0xc0000000, GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED = 0xc0000001, diff --git a/gold/NEWS b/gold/NEWS index 63610a45937..a8f82cd5186 100644 --- a/gold/NEWS +++ b/gold/NEWS @@ -5,6 +5,9 @@ * Remove support for -z bndplt (MPX prefix instructions). +* Add -z memory-seal/-z nomemory-seal options to ELF linker to mark the + object to memory sealed. + Changes in 1.16: * Improve warning messages for relocations that refer to discarded sections. diff --git a/gold/layout.cc b/gold/layout.cc index b43ae841a6c..b59494e0491 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -3277,6 +3277,10 @@ Layout::create_gnu_properties_note() { parameters->target().finalize_gnu_properties(this); + if (parameters->options().memory_seal()) + this->add_gnu_property(elfcpp::NT_GNU_PROPERTY_TYPE_0, + elfcpp::GNU_PROPERTY_MEMORY_SEAL, 0, 0); + if (this->gnu_properties_.empty()) return; diff --git a/gold/options.h b/gold/options.h index 446e8d42614..5a1ab9e4400 100644 --- a/gold/options.h +++ b/gold/options.h @@ -1546,6 +1546,9 @@ class General_options N_("Keep .text.hot, .text.startup, .text.exit and .text.unlikely " "as separate sections in the final binary."), N_("Merge all .text.* prefix sections.")); + DEFINE_bool(memory_seal, options::DASH_Z, '\0', false, + N_("Mark object be memory sealed"), + N_("Don't mark oject to be memory sealed")); public: diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am index 8f158ba20cc..f6eddea65fd 100644 --- a/gold/testsuite/Makefile.am +++ b/gold/testsuite/Makefile.am @@ -4476,3 +4476,22 @@ package_metadata_test.o: package_metadata_main.c package_metadata_test$(EXEEXT): package_metadata_test.o gcctestdir/ld $(CXXLINK) package_metadata_test.o -Wl,--package-metadata='{"foo":"bar"}' $(TEST_READELF) --notes $@ | grep -q '{"foo":"bar"}' + +check_SCRIPTS += memory_seal_test.sh +check_DATA += memory_seal_test_1.stdout memory_seal_test_2.stdout +MOSTLYCLEANFILES += memory_seal_test +memory_seal_test_1.stdout: memory_seal_main + $(TEST_READELF) -n $< >$@ +memory_seal_test_2.stdout: memory_seal_shared.so + $(TEST_READELF) -n $< >$@ +memory_seal_main: gcctestdir/ld memory_seal_main.o + gcctestdir/ld -z memory-seal -o $@ memory_seal_main.o +memory_seal_main.o: memory_seal_main.c + $(COMPILE) -c -o $@ $< +memory_seal_shared.so: gcctestdir/ld memory_seal_shared.o + gcctestdir/ld -z memory-seal -shared -o $@ memory_seal_shared.o +memory_seal_shared.o: memory_seal_shared.c + $(COMPILE) -c -fPIC -o $@ $< + + + diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in index 357dec0d4f9..e95e8ed5d08 100644 --- a/gold/testsuite/Makefile.in +++ b/gold/testsuite/Makefile.in @@ -2888,7 +2888,7 @@ MOSTLYCLEANFILES = *.so *.syms *.stdout *.stderr $(am__append_4) \ $(am__append_88) $(am__append_91) $(am__append_93) \ $(am__append_102) $(am__append_105) $(am__append_108) \ $(am__append_111) $(am__append_114) $(am__append_117) \ - $(am__append_120) $(am__append_121) + $(am__append_120) $(am__append_121) memory_seal_test # We will add to these later, for each individual test. Note # that we add each test under check_SCRIPTS or check_PROGRAMS; @@ -2901,7 +2901,7 @@ check_SCRIPTS = $(am__append_2) $(am__append_21) $(am__append_25) \ $(am__append_89) $(am__append_96) $(am__append_100) \ $(am__append_103) $(am__append_106) $(am__append_109) \ $(am__append_112) $(am__append_115) $(am__append_118) \ - $(am__append_122) + $(am__append_122) memory_seal_test.sh check_DATA = $(am__append_3) $(am__append_22) $(am__append_26) \ $(am__append_32) $(am__append_38) $(am__append_45) \ $(am__append_50) $(am__append_54) $(am__append_58) \ @@ -2910,7 +2910,8 @@ check_DATA = $(am__append_3) $(am__append_22) $(am__append_26) \ $(am__append_90) $(am__append_97) $(am__append_101) \ $(am__append_104) $(am__append_107) $(am__append_110) \ $(am__append_113) $(am__append_116) $(am__append_119) \ - $(am__append_123) + $(am__append_123) memory_seal_test_1.stdout \ + memory_seal_test_2.stdout BUILT_SOURCES = $(am__append_42) TESTS = $(check_SCRIPTS) $(check_PROGRAMS) @@ -6524,6 +6525,13 @@ retain.sh.log: retain.sh --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) +memory_seal_test.sh.log: memory_seal_test.sh + @p='memory_seal_test.sh'; \ + b='memory_seal_test.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) object_unittest.log: object_unittest$(EXEEXT) @p='object_unittest$(EXEEXT)'; \ b='object_unittest'; \ @@ -10524,6 +10532,18 @@ package_metadata_test.o: package_metadata_main.c package_metadata_test$(EXEEXT): package_metadata_test.o gcctestdir/ld $(CXXLINK) package_metadata_test.o -Wl,--package-metadata='{"foo":"bar"}' $(TEST_READELF) --notes $@ | grep -q '{"foo":"bar"}' +memory_seal_test_1.stdout: memory_seal_main + $(TEST_READELF) -n $< >$@ +memory_seal_test_2.stdout: memory_seal_shared.so + $(TEST_READELF) -n $< >$@ +memory_seal_main: gcctestdir/ld memory_seal_main.o + gcctestdir/ld -z memory-seal -o $@ memory_seal_main.o +memory_seal_main.o: memory_seal_main.c + $(COMPILE) -c -o $@ $< +memory_seal_shared.so: gcctestdir/ld memory_seal_shared.o + gcctestdir/ld -z memory-seal -shared -o $@ memory_seal_shared.o +memory_seal_shared.o: memory_seal_shared.c + $(COMPILE) -c -fPIC -o $@ $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/gold/testsuite/memory_seal_main.c b/gold/testsuite/memory_seal_main.c new file mode 100644 index 00000000000..77bc677e8eb --- /dev/null +++ b/gold/testsuite/memory_seal_main.c @@ -0,0 +1,5 @@ +int +main(void) +{ + return 0; +} diff --git a/gold/testsuite/memory_seal_shared.c b/gold/testsuite/memory_seal_shared.c new file mode 100644 index 00000000000..8cf7b6143da --- /dev/null +++ b/gold/testsuite/memory_seal_shared.c @@ -0,0 +1,7 @@ +int foo (void); + +int +foo(void) +{ + return 0; +} diff --git a/gold/testsuite/memory_seal_test.sh b/gold/testsuite/memory_seal_test.sh new file mode 100755 index 00000000000..c2194213445 --- /dev/null +++ b/gold/testsuite/memory_seal_test.sh @@ -0,0 +1,45 @@ +#!/bin/sh + +# memory_seal_test.sh -- test GNU_PROPERTY_MEMORY_SEAL gnu property + +# Copyright (C) 2018-2024 Free Software Foundation, Inc. + +# This file is part of gold. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +# MA 02110-1301, USA. + +# This script checks that after linking the three object files +# gnu_property_[abc].S, each of which contains a .note.gnu.property +# section, the resulting output has only a single such note section, +# and that the properties have been correctly combined. + +check() +{ + if ! grep -q "$2" "$1" + then + echo "Did not find expected output in $1:" + echo " $2" + echo "" + echo "Actual output below:" + cat "$1" + exit 1 + fi +} + +check memory_seal_test_1.stdout "memory seal" +check memory_seal_test_2.stdout "memory seal" + +exit 0