From patchwork Thu Nov 8 20:13:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 30082 Received: (qmail 19540 invoked by alias); 8 Nov 2018 20:13:46 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 19419 invoked by uid 89); 8 Nov 2018 20:13:45 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.2 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_SOFTFAIL autolearn=ham version=3.3.2 spammy=HContent-Transfer-Encoding:8bit X-HELO: mga18.intel.com From: "H.J. Lu" To: libc-alpha@sourceware.org Subject: [PATCH 2/2] x86/CET: Stop if the GNU_PROPERTY_X86_UINT32_VALID bit is set Date: Thu, 8 Nov 2018 12:13:40 -0800 Message-Id: <20181108201340.29845-3-hjl.tools@gmail.com> In-Reply-To: <20181108201340.29845-1-hjl.tools@gmail.com> References: <20181108201340.29845-1-hjl.tools@gmail.com> MIME-Version: 1.0 When updated linkers merge input .note.gnu.property sections into one .note.gnu.property section, it sets the GNU_PROPERTY_X86_UINT32_VALID bit in the GNU_PROPERTY_X86_FEATURE_1_AND property. This can be used to detect if the NT_GNU_PROPERTY_TYPE_0 note is generated by updated linkers. If the GNU_PROPERTY_X86_UINT32_VALID bit is set, we can stop checking for invalid .note.gnu.property section. * sysdeps/x86/dl-prop.h (_dl_process_cet_property_note): Stop if the GNU_PROPERTY_X86_UINT32_VALID bit is set. --- sysdeps/x86/dl-prop.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sysdeps/x86/dl-prop.h b/sysdeps/x86/dl-prop.h index 9ab890d12b..5c06aa5fbc 100644 --- a/sysdeps/x86/dl-prop.h +++ b/sysdeps/x86/dl-prop.h @@ -115,6 +115,11 @@ _dl_process_cet_property_note (struct link_map *l, feature_1 = *(unsigned int *) ptr; + /* Done if this property note is created by updated + linker. */ + if ((feature_1 & GNU_PROPERTY_X86_UINT32_VALID)) + goto found_feature_1; + /* Keep searching for the next GNU property note generated by the older linker. */ break; @@ -138,6 +143,7 @@ _dl_process_cet_property_note (struct link_map *l, align)); } +found_feature_1: /* We get here only if there is one or no GNU property note. */ if ((feature_1 & GNU_PROPERTY_X86_FEATURE_1_IBT)) l->l_cet |= lc_ibt;