From patchwork Mon Jan 3 23:04:30 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 49493 X-Patchwork-Delegate: azanella@linux.vnet.ibm.com Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4DF8B385840E for ; Mon, 3 Jan 2022 23:06:25 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4DF8B385840E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1641251185; bh=wd4P+RyD469WlfziuBSlDXolraqUYcYdjj2Gz5lSYLE=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=jErj6QefHdg4X4LTu/GEq+Pduh2iSeY4s5z3/2+an40gKW4sWENXuYrN/yp8Cgx0A WJ/0WMpbPPz7S8WT3gMbCL1u563FapfKC5m7XZ/S3P3GsqMrMdrpdC+Rd9N/omGXJF iPce1+17pfcHYD7oPKYzFIybRZ9M176EdwykQVQM= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pl1-x636.google.com (mail-pl1-x636.google.com [IPv6:2607:f8b0:4864:20::636]) by sourceware.org (Postfix) with ESMTPS id 195E03858411 for ; Mon, 3 Jan 2022 23:04:38 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 195E03858411 Received: by mail-pl1-x636.google.com with SMTP id l15so11006404pls.7 for ; Mon, 03 Jan 2022 15:04:38 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wd4P+RyD469WlfziuBSlDXolraqUYcYdjj2Gz5lSYLE=; b=63+6FqIfmvqCjXtOg9S1sYc0FnUnk4+gIwJ5Bz3UZkvGEYR2JbPOwRFP92dJaD+3Pt rJBlJNbPL/p1kYC+l246eLMeICtEOAFV7FMRh9SpSQUWAyrk997BX/97uLHEKPHiUhs8 ghdVkZvkq7DtY/mRMpohm4oilblaK+ssfA06nb509A2ZXhN/pp+eSwZWO2AqV6q+jPoG wBeUrMhtED77lx26IEcs1R5+bVvwW5BicB8jWugeCW7QUmHYYUQtsFUL9aZkJ61NE8DA qiApQpWqeFuKSHMqlP6bVSddti0t76dEZDEEXDlmWeHfqBgeNMBNSBY2IgvlAY7Da+CN kE4A== X-Gm-Message-State: AOAM533giG0kK7uE01HpgArycghcjptW9kkSAqTYz6MYMyMRs8+KDUbk fT3haoW9XvMjTqwqUaIDWMmDxg9mo4g= X-Google-Smtp-Source: ABdhPJwP59YBtRFcEjhZvJmkg7N0mCByy43xdg/hFMg9G4rIEEu5MBRMNb9f9Hot2evMVIKPaPUglw== X-Received: by 2002:a17:90b:d83:: with SMTP id bg3mr56895610pjb.30.1641251077168; Mon, 03 Jan 2022 15:04:37 -0800 (PST) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id e21sm23095130pjr.4.2022.01.03.15.04.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Jan 2022 15:04:35 -0800 (PST) Received: from gnu-tgl-2.localdomain (gnu-tgl-2 [192.168.1.42]) by gnu-tgl-3.localdomain (Postfix) with ESMTPS id A6A93C0692; Mon, 3 Jan 2022 15:04:34 -0800 (PST) Received: from gnu-tgl-2.. (localhost [IPv6:::1]) by gnu-tgl-2.localdomain (Postfix) with ESMTP id 7D341300436; Mon, 3 Jan 2022 15:04:33 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH v7 1/4] elf: Properly align all PT_LOAD segments [BZ #28676] Date: Mon, 3 Jan 2022 15:04:30 -0800 Message-Id: <20220103230433.1907240-2-hjl.tools@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20220103230433.1907240-1-hjl.tools@gmail.com> References: <20220103230433.1907240-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3029.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "H.J. Lu via Libc-alpha" From: "H.J. Lu" Reply-To: "H.J. Lu" Cc: Florian Weimer Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Linker may set p_align of a PT_LOAD segment larger than p_align of the first PT_LOAD segment to satisfy a section alignment: Elf file type is DYN (Shared object file) Entry point 0x0 There are 10 program headers, starting at offset 64 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flags Align LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000834 0x0000000000000834 R E 0x1000 LOAD 0x0000000000000e00 0x0000000000001e00 0x0000000000001e00 0x0000000000000230 0x0000000000000230 RW 0x1000 LOAD 0x0000000000400000 0x0000000000400000 0x0000000000400000 0x0000000000000004 0x0000000000000008 RW 0x400000 ... Section to Segment mapping: Segment Sections... 00 .note.gnu.property .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .plt.got .text .fini .rodata .eh_frame_hdr .eh_frame 01 .init_array .fini_array .data.rel.ro .dynamic .got .got.plt 02 .data .bss We should align the first PT_LOAD segment to the maximum p_align of all PT_LOAD segments, similar to the kernel commit: commit ce81bb256a224259ab686742a6284930cbe4f1fa Author: Chris Kennelly Date: Thu Oct 15 20:12:32 2020 -0700 fs/binfmt_elf: use PT_LOAD p_align values for suitable start address --- elf/dl-load.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/elf/dl-load.c b/elf/dl-load.c index ddc4295ef5..109bed3fb5 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -1101,6 +1101,7 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd, size_t nloadcmds = 0; bool has_holes = false; bool empty_dynamic = false; + ElfW(Addr) p_align_max = 0; /* The struct is initialized to zero so this is not necessary: l->l_ld = 0; @@ -1146,7 +1147,9 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd, c->mapend = ALIGN_UP (ph->p_vaddr + ph->p_filesz, GLRO(dl_pagesize)); c->dataend = ph->p_vaddr + ph->p_filesz; c->allocend = ph->p_vaddr + ph->p_memsz; - c->mapalign = ph->p_align; + /* Remember the maximum p_align. */ + if (ph->p_align > p_align_max) + p_align_max = ph->p_align; c->mapoff = ALIGN_DOWN (ph->p_offset, GLRO(dl_pagesize)); /* Determine whether there is a gap between the last segment @@ -1221,6 +1224,10 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd, goto lose; } + /* Align all PT_LOAD segments to the maximum p_align. */ + for (size_t i = 0; i < nloadcmds; i++) + loadcmds[i].mapalign = p_align_max; + /* dlopen of an executable is not valid because it is not possible to perform proper relocations, handle static TLS, or run the ELF constructors. For PIE, the check needs the dynamic From patchwork Mon Jan 3 23:04:31 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 49494 X-Patchwork-Delegate: azanella@linux.vnet.ibm.com Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BEADC3858418 for ; Mon, 3 Jan 2022 23:07:07 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BEADC3858418 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1641251227; bh=xG7OKtw+NZur35Gu3Ttd2uOfipnl1Qc9lUj6gkJ08nU=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=t/GHIgKF+09d5xw3jprDwEjnV0lRbXPUvBeo2U1rJwdBj9nxdQkwWy0TQlP48jIFV NzKP+zCD9+YXR/nm06E/Lu8WdtMikKGRC/osOcVC71VBfsFKKdDrpwDIMiC2CfmtID 5EK7cc/moMMfSNbbqO2jNTgWGQQgeQh339JngUDU= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pj1-x1034.google.com (mail-pj1-x1034.google.com [IPv6:2607:f8b0:4864:20::1034]) by sourceware.org (Postfix) with ESMTPS id EBAB4385840E for ; Mon, 3 Jan 2022 23:04:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org EBAB4385840E Received: by mail-pj1-x1034.google.com with SMTP id b1-20020a17090a990100b001b14bd47532so1229475pjp.0 for ; Mon, 03 Jan 2022 15:04:37 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=xG7OKtw+NZur35Gu3Ttd2uOfipnl1Qc9lUj6gkJ08nU=; b=R7aTtxyN7E+47UAHNnFQlvxGRGfZPLDb9eVNcxZil+LG4vdB6oUwDb3J8StiyACzNR 7c+8rucPEvxBQORw5LA4XRPH3/TghlWWdGb46vtuk7j+77uHqqRFIN1JWeY/p0wcFNtj IVLY9bWrkSnd1/sy2AtQrygV4n0UsKZE676i5904FMehnus6rLFmsFvbSLs+hKaI0mu8 gsHJG+CNc5BlSZqsFuxvQ5WcksWOJ3Yp+bEowyv8b5jxV42DmUsbQERkCk4YmdyeyzFr sY/1X599pWFjnpN84U3IE0TLKXPKU/zTvL3E7gF6j4AXkLmqsdkcfGcvyxu+58t4Z5ww DA2Q== X-Gm-Message-State: AOAM532ormN/lMp10Wj6Fy9IInIva/+jDLCrroIC6cceVVYDOFByXhkg ZEmsZu7yeK7AMorDF89SHGU= X-Google-Smtp-Source: ABdhPJyMZ7UFle2ncMET46YzrLeDo8nWFuW0MJW2k5ORGqOeCoPcB/fyUTAiIgBj897A0fBrAJ3/4A== X-Received: by 2002:a17:902:be15:b0:149:a608:7098 with SMTP id r21-20020a170902be1500b00149a6087098mr18782761pls.63.1641251076712; Mon, 03 Jan 2022 15:04:36 -0800 (PST) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id f14sm40413368pfv.215.2022.01.03.15.04.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Jan 2022 15:04:35 -0800 (PST) Received: from gnu-tgl-2.localdomain (gnu-tgl-2 [192.168.1.42]) by gnu-tgl-3.localdomain (Postfix) with ESMTPS id A765FC08CE; Mon, 3 Jan 2022 15:04:34 -0800 (PST) Received: from gnu-tgl-2.. (localhost [IPv6:::1]) by gnu-tgl-2.localdomain (Postfix) with ESMTP id 88DDC300437; Mon, 3 Jan 2022 15:04:33 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH v7 2/4] elf: Add a test for PT_LOAD segments with mixed p_align [BZ #28676] Date: Mon, 3 Jan 2022 15:04:31 -0800 Message-Id: <20220103230433.1907240-3-hjl.tools@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20220103230433.1907240-1-hjl.tools@gmail.com> References: <20220103230433.1907240-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3029.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "H.J. Lu via Libc-alpha" From: "H.J. Lu" Reply-To: "H.J. Lu" Cc: Florian Weimer Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Add tst-p_alignmod1-edit to edit the copy of tst-alignmod3.so to reduce p_align of the first PT_LOAD segment by half and verify that the shared library is mapped with the maximum p_align of all PT_LOAD segments. --- elf/Makefile | 18 ++++++ elf/tst-elf-edit.h | 126 +++++++++++++++++++++++++++++++++++++ elf/tst-p_align1.c | 27 ++++++++ elf/tst-p_alignmod1-edit.c | 34 ++++++++++ 4 files changed, 205 insertions(+) create mode 100644 elf/tst-elf-edit.h create mode 100644 elf/tst-p_align1.c create mode 100644 elf/tst-p_alignmod1-edit.c diff --git a/elf/Makefile b/elf/Makefile index 883578ee36..9c831faac1 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -403,6 +403,13 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ tst-dl_find_object-mod8 \ tst-dl_find_object-mod9 \ +ifeq (yes,$(build-shared)) +tests += \ + tst-p_alignmod1-edit \ + tst-p_align1 \ + +endif + # Most modules build with _ISOMAC defined, but those filtered out # depend on internal headers. modules-names-tests = $(filter-out ifuncmod% tst-tlsmod%,\ @@ -2079,3 +2086,14 @@ CFLAGS-tst-dl_find_object-mod6.c += -funwind-tables CFLAGS-tst-dl_find_object-mod7.c += -funwind-tables CFLAGS-tst-dl_find_object-mod8.c += -funwind-tables CFLAGS-tst-dl_find_object-mod9.c += -funwind-tables + +$(objpfx)tst-p_align1: $(objpfx)tst-p_alignmod1.so + +# Make a copy of tst-alignmod3.so and lower p_align of the first PT_LOAD +# segment. +$(objpfx)tst-p_alignmod1.so: $(objpfx)tst-p_alignmod1-edit \ + $(objpfx)tst-alignmod3.so + rm -f $@ + cp $(objpfx)tst-alignmod3.so $@ + $(test-wrapper-env) $(run-program-env) $(rtld-prefix) \ + $(objpfx)tst-p_alignmod1-edit $@ diff --git a/elf/tst-elf-edit.h b/elf/tst-elf-edit.h new file mode 100644 index 0000000000..ce98cf012c --- /dev/null +++ b/elf/tst-elf-edit.h @@ -0,0 +1,126 @@ +/* Update p_align of the first PT_LOAD segment. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const char *file_name; + +static size_t update_p_align (size_t); + +int +main (int argc, char ** argv) +{ + if (argc != 2) + { + printf ("Usage: %s: file\n", argv[0]); + return 0; + } + + file_name = argv[1]; + struct stat statbuf; + int errno_saved; + + if (stat (file_name, &statbuf) < 0) + error (1, errno, "%s: not exist", file_name); + + ElfW(Ehdr) *ehdr; + + if (statbuf.st_size < sizeof (*ehdr)) + error (1, 0, "%s: too small", file_name); + + int fd = open (file_name, O_RDWR); + if (fd < 0) + error (1, errno, "%s: can't open", file_name); + + /* Map in the whole file. */ + void *base = mmap (NULL, statbuf.st_size, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, 0); + if (base == MAP_FAILED) + { + errno_saved = errno; + close (fd); + error (1, errno_saved, "%s: failed to map", file_name); + } + + ehdr = (ElfW(Ehdr) *) base; + if (ehdr->e_ident[EI_MAG0] != ELFMAG0 + || ehdr->e_ident[EI_MAG1] != ELFMAG1 + || ehdr->e_ident[EI_MAG2] != ELFMAG2 + || ehdr->e_ident[EI_MAG3] != ELFMAG3) + { + close (fd); + error (1, 0, "%s: bad ELF header", file_name); + } + + if (ehdr->e_type != ET_DYN) + { + close (fd); + error (1, 0, "%s: not shared library", file_name); + } + + bool unsupported_class = true; + switch (ehdr->e_ident[EI_CLASS]) + { + default: + break; + + case ELFCLASS32: + unsupported_class = __ELF_NATIVE_CLASS != 32; + break; + + case ELFCLASS64: + unsupported_class = __ELF_NATIVE_CLASS != 64; + break; + } + + if (unsupported_class) + { + close (fd); + error (1, 0, "%s: unsupported ELF class: %d", + file_name, ehdr->e_ident[EI_CLASS]); + } + + size_t phdr_size = sizeof (ElfW(Phdr)) * ehdr->e_phentsize; + if (statbuf.st_size < (ehdr->e_phoff + phdr_size)) + { + close (fd); + error (1, 0, "%s: too small", file_name); + } + + ElfW(Phdr) *phdr = (ElfW(Phdr) *) (base + ehdr->e_phoff); + for (int i = 0; i < ehdr->e_phnum; i++, phdr++) + if (phdr->p_type == PT_LOAD) + { + /* Update p_align of the first PT_LOAD segment. */ + phdr->p_align = update_p_align (phdr->p_align); + break; + } + + munmap (base, statbuf.st_size); + close (fd); + + return 0; +} diff --git a/elf/tst-p_align1.c b/elf/tst-p_align1.c new file mode 100644 index 0000000000..cab9793220 --- /dev/null +++ b/elf/tst-p_align1.c @@ -0,0 +1,27 @@ +/* Check different alignments of PT_LOAD segments in a shared library. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +extern int do_load_test (void); + +static int +do_test (void) +{ + return do_load_test (); +} + +#include diff --git a/elf/tst-p_alignmod1-edit.c b/elf/tst-p_alignmod1-edit.c new file mode 100644 index 0000000000..2aa0e7ccdd --- /dev/null +++ b/elf/tst-p_alignmod1-edit.c @@ -0,0 +1,34 @@ +/* Reduce p_align of the first PT_LOAD segment by half. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "tst-elf-edit.h" + +/* Reduce p_align by half. */ + +static size_t +update_p_align (size_t p_align) +{ + size_t pagesize = sysconf (_SC_PAGESIZE); + size_t new_p_align = p_align >> 1; + + if (new_p_align < pagesize) + error (1, 0, "%s: new p_align (0x%zx) < page size (0x%zx)", + file_name, new_p_align, pagesize); + + return new_p_align; +} From patchwork Mon Jan 3 23:04:32 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 49491 X-Patchwork-Delegate: azanella@linux.vnet.ibm.com Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2EA143858405 for ; Mon, 3 Jan 2022 23:05:01 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2EA143858405 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1641251101; bh=hOVkmFvzjZJJt0zE2PC3EvOZ7vMyvvhZ1IVpw9SDpMs=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=up++wlvhaSPqtHWwegmcyp9qgZZffeigXPtlLLFN1YlwSZC1fT+eM1gd0kLsnV1wz iX6DMUhQlPaOIHg+/FX3Icv+iC387IWA54saosUKRnWCZz51/FTWh30gbbiPs1Ve35 GRZiqrzAgZRX3O2LLg8FLQLI3tRSELsAGnw0vLsY= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pj1-x1033.google.com (mail-pj1-x1033.google.com [IPv6:2607:f8b0:4864:20::1033]) by sourceware.org (Postfix) with ESMTPS id 4CA813858C27 for ; Mon, 3 Jan 2022 23:04:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 4CA813858C27 Received: by mail-pj1-x1033.google.com with SMTP id y16-20020a17090a6c9000b001b13ffaa625so38946826pjj.2 for ; Mon, 03 Jan 2022 15:04:37 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=hOVkmFvzjZJJt0zE2PC3EvOZ7vMyvvhZ1IVpw9SDpMs=; b=0qTN5W0LtCuHIblGb7VDJ7TYYwZQEoyfoIVmdJPkp6gerfc9VuAPe8SLkB29uINVzi gfHPP4f99l3tmeMz35mvMqt8s9dCZe3n7hZEx6kFv79UauoP14nityKHdqcomtj1PmOD hP13fsVGRck8eDtXlr7wMyZJCx2y/i8XalKdXxghJoE2GQ+Wf9JqYoBPHwisFRpWlJEs 6VWV2lxWEeohqTEab2LdVKg7BMQeT6V3hig1Yf6S/Vp30l5Ls5U1dJbMxe8v603Ji+Za RYj8bZh+tCtrHj8q6SpbVRimvLgQEXLz7vYqL6m4vvgtNyAklbuQV/R5dlQRXPko2Ze7 WOBQ== X-Gm-Message-State: AOAM533rVW2vZv4dSYP7Pf5DqZPR9hm9uuYqAahULmRD07BCHWK6BoqE A2bcXEqkdQWzvjrjTlpfPiDDeuh54PY= X-Google-Smtp-Source: ABdhPJz+EfzjlajkUO1btmUwaFRgvhHP71VCrE+G4i/hda2kHBTvUwKEN3e9g9IB6/uSryHHGR+7Bg== X-Received: by 2002:a17:90b:1e08:: with SMTP id pg8mr58078413pjb.53.1641251076333; Mon, 03 Jan 2022 15:04:36 -0800 (PST) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id e16sm37580126pfd.38.2022.01.03.15.04.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Jan 2022 15:04:35 -0800 (PST) Received: from gnu-tgl-2.localdomain (gnu-tgl-2 [192.168.1.42]) by gnu-tgl-3.localdomain (Postfix) with ESMTPS id A82AEC0D75; Mon, 3 Jan 2022 15:04:34 -0800 (PST) Received: from gnu-tgl-2.. (localhost [IPv6:::1]) by gnu-tgl-2.localdomain (Postfix) with ESMTP id 94A5B300438; Mon, 3 Jan 2022 15:04:33 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH v7 3/4] elf: Add a test for PT_LOAD segments with p_align == 1 [BZ #28688] Date: Mon, 3 Jan 2022 15:04:32 -0800 Message-Id: <20220103230433.1907240-4-hjl.tools@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20220103230433.1907240-1-hjl.tools@gmail.com> References: <20220103230433.1907240-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3029.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "H.J. Lu via Libc-alpha" From: "H.J. Lu" Reply-To: "H.J. Lu" Cc: Florian Weimer Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Add tst-p_alignmod2-edit to edit the copy of tst-alignmod3.so to set p_align of the first PT_LOAD segment to 1 and verify that the shared library can be loaded normally. --- elf/Makefile | 13 +++++++++++++ elf/tst-p_align2.c | 27 +++++++++++++++++++++++++++ elf/tst-p_alignmod2-edit.c | 27 +++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 elf/tst-p_align2.c create mode 100644 elf/tst-p_alignmod2-edit.c diff --git a/elf/Makefile b/elf/Makefile index 9c831faac1..e4be3fa518 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -406,7 +406,9 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ ifeq (yes,$(build-shared)) tests += \ tst-p_alignmod1-edit \ + tst-p_alignmod2-edit \ tst-p_align1 \ + tst-p_align2 \ endif @@ -2097,3 +2099,14 @@ $(objpfx)tst-p_alignmod1.so: $(objpfx)tst-p_alignmod1-edit \ cp $(objpfx)tst-alignmod3.so $@ $(test-wrapper-env) $(run-program-env) $(rtld-prefix) \ $(objpfx)tst-p_alignmod1-edit $@ + +$(objpfx)tst-p_align2: $(objpfx)tst-p_alignmod2.so + +# Make a copy of tst-alignmod3.so and update p_align of the first PT_LOAD +# segment. +$(objpfx)tst-p_alignmod2.so: $(objpfx)tst-p_alignmod2-edit \ + $(objpfx)tst-alignmod3.so + rm -f $@ + cp $(objpfx)tst-alignmod3.so $@ + $(test-wrapper-env) $(run-program-env) $(rtld-prefix) \ + $(objpfx)tst-p_alignmod2-edit $@ diff --git a/elf/tst-p_align2.c b/elf/tst-p_align2.c new file mode 100644 index 0000000000..cab9793220 --- /dev/null +++ b/elf/tst-p_align2.c @@ -0,0 +1,27 @@ +/* Check different alignments of PT_LOAD segments in a shared library. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +extern int do_load_test (void); + +static int +do_test (void) +{ + return do_load_test (); +} + +#include diff --git a/elf/tst-p_alignmod2-edit.c b/elf/tst-p_alignmod2-edit.c new file mode 100644 index 0000000000..2f47b37c9e --- /dev/null +++ b/elf/tst-p_alignmod2-edit.c @@ -0,0 +1,27 @@ +/* Set p_align of the first PT_LOAD segment to 1. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "tst-elf-edit.h" + +/* Set p_align to 1. */ + +static size_t +update_p_align (size_t p_align __attribute__ ((unused))) +{ + return 1; +} From patchwork Mon Jan 3 23:04:33 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 49495 X-Patchwork-Delegate: azanella@linux.vnet.ibm.com Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 80E203858C2C for ; Mon, 3 Jan 2022 23:07:54 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 80E203858C2C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1641251274; bh=266Bb9Y4ha98ahfT4KIkHHjnCCghd9omKFUw6Yk13ME=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=HWnnF1qhr5tsAQ2OBmB4itlcO58QQ46EUMoW2jpi5H9VzeTZTaGrv72WFj9q2TQCF Mau0d9hZHrkJOUlSOXGOlMPQeLaGDA+gq0TNIC50YqtTBGHDmL9CDq3Xv5Qjc5AjbE g6Yu6cbNQZU7rrIn3ew4MzdiNgvOqGNpZtWQY5pU= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pj1-x1030.google.com (mail-pj1-x1030.google.com [IPv6:2607:f8b0:4864:20::1030]) by sourceware.org (Postfix) with ESMTPS id 6B5C9385841A for ; Mon, 3 Jan 2022 23:04:38 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6B5C9385841A Received: by mail-pj1-x1030.google.com with SMTP id lr15-20020a17090b4b8f00b001b19671cbebso1200823pjb.1 for ; Mon, 03 Jan 2022 15:04:38 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=266Bb9Y4ha98ahfT4KIkHHjnCCghd9omKFUw6Yk13ME=; b=TxhVHumvc/JWgnqDiHkl/Agefxk1QpcITkpWfLpzw9OzaiDV5/jaF1OHEs1jJGhey5 V0SD1RY0qC/Wztr7qJWF6UFlBoyE+wKDCDDkpey6pBALvypc7CVxD8KRd/VjjNnTw2kO j6ugZbp1Wo/MugWcjsclJlxAx/HWIvqQOem0AobyXxIK/OYS83PMZHp3qxKJ9yjQcIhs hQGZkHHvySeYdkqjlAp8mpt/V6vE4iwwO9JWN9A+TQ+ec4+pNNzSEvKKCJIUYEFvRZed zzfSlUPgSCqMDfrTo5jMNHFy1gCDuNqJyASLx2cih4dyyalxg7TV5b4KVhbuwW77XSNj muGw== X-Gm-Message-State: AOAM5300S1AB8wdTIDy9wbq2Rw8268IEIdt49psJfkaK5XbwGn3/R6ct AQCSz8RG+UweC63Wsc2kltIMAAAZfqw= X-Google-Smtp-Source: ABdhPJw4z4BOjCDLlN9QFDYI98kbFk4JLk2cmOStONhoYzgJEzaXDnmwEUk8wHApNIQrK/uA8hcnYA== X-Received: by 2002:a17:90b:8d:: with SMTP id bb13mr20785427pjb.156.1641251077372; Mon, 03 Jan 2022 15:04:37 -0800 (PST) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id k70sm32570132pgd.19.2022.01.03.15.04.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Jan 2022 15:04:35 -0800 (PST) Received: from gnu-tgl-2.localdomain (gnu-tgl-2 [192.168.1.42]) by gnu-tgl-3.localdomain (Postfix) with ESMTPS id A8BE1C0D76; Mon, 3 Jan 2022 15:04:34 -0800 (PST) Received: from gnu-tgl-2.. (localhost [IPv6:::1]) by gnu-tgl-2.localdomain (Postfix) with ESMTP id 9641F300439; Mon, 3 Jan 2022 15:04:33 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH v7 4/4] elf: Add a test for PT_LOAD segments with invalid p_align [BZ #28688] Date: Mon, 3 Jan 2022 15:04:33 -0800 Message-Id: <20220103230433.1907240-5-hjl.tools@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20220103230433.1907240-1-hjl.tools@gmail.com> References: <20220103230433.1907240-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3029.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "H.J. Lu via Libc-alpha" From: "H.J. Lu" Reply-To: "H.J. Lu" Cc: Florian Weimer Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Build tst-p_alignmod3.so with 256 byte page size and verify that it is rejected with a proper error message. --- elf/Makefile | 11 +++++++++++ elf/tst-p_align3.c | 27 +++++++++++++++++++++++++++ elf/tst-p_align3.sh | 26 ++++++++++++++++++++++++++ elf/tst-p_alignmod3.c | 22 ++++++++++++++++++++++ 4 files changed, 86 insertions(+) create mode 100644 elf/tst-p_align3.c create mode 100755 elf/tst-p_align3.sh create mode 100644 elf/tst-p_alignmod3.c diff --git a/elf/Makefile b/elf/Makefile index e4be3fa518..eca730ae8f 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -409,6 +409,10 @@ tests += \ tst-p_alignmod2-edit \ tst-p_align1 \ tst-p_align2 \ + tst-p_align3 \ + +modules-names += \ + tst-p_alignmod3 \ endif @@ -2110,3 +2114,10 @@ $(objpfx)tst-p_alignmod2.so: $(objpfx)tst-p_alignmod2-edit \ cp $(objpfx)tst-alignmod3.so $@ $(test-wrapper-env) $(run-program-env) $(rtld-prefix) \ $(objpfx)tst-p_alignmod2-edit $@ + +LDFLAGS-tst-p_alignmod3.so += -Wl,-z,max-page-size=0x100,-z,common-page-size=0x100 + +$(objpfx)tst-p_align3: $(objpfx)tst-p_alignmod3.so +$(objpfx)tst-p_align3.out: tst-p_align3.sh $(objpfx)tst-p_align3 + $(SHELL) $< $(common-objpfx) '$(test-program-prefix)'; \ + $(evaluate-test) diff --git a/elf/tst-p_align3.c b/elf/tst-p_align3.c new file mode 100644 index 0000000000..61c616ac3b --- /dev/null +++ b/elf/tst-p_align3.c @@ -0,0 +1,27 @@ +/* Check invalid p_align of PT_LOAD segments in a shared library. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +extern int do_load_test (void); + +static int +do_test (void) +{ + return do_load_test (); +} + +#include diff --git a/elf/tst-p_align3.sh b/elf/tst-p_align3.sh new file mode 100755 index 0000000000..11572aa217 --- /dev/null +++ b/elf/tst-p_align3.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# Check invalid p_align of PT_LOAD segments in a shared library. +# Copyright (C) 2021 Free Software Foundation, Inc. +# This file is part of the GNU C Library. + +# The GNU C Library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +# The GNU C Library 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 +# Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public +# License along with the GNU C Library; if not, see +# . + +common_objpfx=$1; shift +test_program_prefix=$1; shift + +${test_program_prefix} \ + ${common_objpfx}elf/tst-p_align3 \ + 2> ${common_objpfx}elf/tst-p_align3.out && exit 1 +grep "ELF load command address/offset not page-aligned" ${common_objpfx}elf/tst-p_align3.out diff --git a/elf/tst-p_alignmod3.c b/elf/tst-p_alignmod3.c new file mode 100644 index 0000000000..90f3af467e --- /dev/null +++ b/elf/tst-p_alignmod3.c @@ -0,0 +1,22 @@ +/* Check invalid p_align of PT_LOAD segment in a shared library. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +void +do_load_test (void) +{ +}