From patchwork Tue Jan 18 21:57:28 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: 50197 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 BFB133857C6F for ; Tue, 18 Jan 2022 21:59:24 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BFB133857C6F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1642543164; bh=KvlU/2KPXOtX50ucggNWnNzRk0W/XNocOxaLOvew1To=; 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=kQDjsWR1WSyJa/26d1oibDbXPV/P9Qf5+QAmL8Y2Bne8rf2bVuLPL0x+1vYNbouiX aDjHuJRpi5CvSaFLlyvEaXv5pJGACEscC49sYQuMY4P47Jgy8TIXoRzrYC7yK6wU0f 8TfU2HhfDpbkdCf6NpVckXW+mJSnRVdYdzhVFKxM= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pg1-x536.google.com (mail-pg1-x536.google.com [IPv6:2607:f8b0:4864:20::536]) by sourceware.org (Postfix) with ESMTPS id 9A12E385840B for ; Tue, 18 Jan 2022 21:57:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 9A12E385840B Received: by mail-pg1-x536.google.com with SMTP id i8so413584pgt.13 for ; Tue, 18 Jan 2022 13:57:35 -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=KvlU/2KPXOtX50ucggNWnNzRk0W/XNocOxaLOvew1To=; b=39we96pYBRmGj/WZ1vETo5Z/Cqd0SRScEFIrwqkLNtt4ZdwIt7KmvnPy/TfY4EtyVn Og+5I09e7OGhpJJdr4AlIq2Ymg/2ab1vo2vmPBnGmfKtYSPQ8InOKAHiwJbNpRCB3rYR 8ia1ANs7Yhieq00JHYf/aIQdCGIX0Ida6U+p2GV2gEd4Jpl5SYIX8+jRmFs6abUZ7jc/ dA3tj7zkPrizQhcpyCIwWgDlsqQr4+4auDfjdJD8GuZNShby3RDtKq7usQ5Wbq6LWJur gTAAb51/K2bfchmIwT3dtiQK+Puub5aVyL/PUoI+wNqhtiQ3jg5LonSSf/0Vs/sn0qjx QV4A== X-Gm-Message-State: AOAM530xjBxRMFjlPWDaUA1IrH82CqId6h4+HjQKy6gDPDAbA4tqHzLD pxtfCGbVQp68s1d422a9qbw= X-Google-Smtp-Source: ABdhPJwwIRuu2IQNWO6rnB/y3+Xbq6aEaDxvj9fLUxHJFOCxW2uFnOCu2b8/B+JB0pcQgougptWQiw== X-Received: by 2002:a05:6a00:24d1:b0:4c1:f8f5:9f9c with SMTP id d17-20020a056a0024d100b004c1f8f59f9cmr25312727pfv.60.1642543054710; Tue, 18 Jan 2022 13:57:34 -0800 (PST) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id p11sm15860695pgh.23.2022.01.18.13.57.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Jan 2022 13:57:33 -0800 (PST) Received: from gnu-tgl-3.. (localhost [IPv6:::1]) by gnu-tgl-3.localdomain (Postfix) with ESMTP id F0642C05B1; Tue, 18 Jan 2022 13:57:31 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH v8 1/4] elf: Properly align all PT_LOAD segments [BZ #28676] Date: Tue, 18 Jan 2022 13:57:28 -0800 Message-Id: <20220118215731.1320930-2-hjl.tools@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220118215731.1320930-1-hjl.tools@gmail.com> References: <20220118215731.1320930-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 Reviewed-by: Adhemerval Zanella --- 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 12744caf91..5b0ff41ee1 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 (powerof2 (ph->p_align) && 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 Tue Jan 18 21:57:29 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: 50198 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 F3E923857C6A for ; Tue, 18 Jan 2022 22:00:06 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F3E923857C6A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1642543207; bh=4QbEWSwRWPWU3wmzEcj7cWlmFkPt69EX72bRd6IR928=; 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=YZS3OJfwR7Jp1gLg4WnFwZa8AKsqxFAGyu7qZj+fuQrF7w3FJBr3L+9gBsVhBrDZy KLtMO7s+NNjJ4dSc2o6S23ULqt0XmwgkuoiWdOPG22AE9b4qkLmDbOwE8RAFpmmxK3 KzibYwMaQcY9oJxkR5lrcN7qa+X0XigS1vFsJjGg= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pg1-x529.google.com (mail-pg1-x529.google.com [IPv6:2607:f8b0:4864:20::529]) by sourceware.org (Postfix) with ESMTPS id 1A8E03857C43 for ; Tue, 18 Jan 2022 21:57:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 1A8E03857C43 Received: by mail-pg1-x529.google.com with SMTP id i8so413628pgt.13 for ; Tue, 18 Jan 2022 13:57: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=4QbEWSwRWPWU3wmzEcj7cWlmFkPt69EX72bRd6IR928=; b=IEMRzTcCjqvAppESE9zDu5Yuev5Unt3zSlGnJi5uQVCeR9jLHXQfTx2MAV85bDQAYl RftpsCjPXXdXAJ5vHs0uXSUyVcXnUijGITcBt6ioJI23j8cLWoltz94ozbeb8lpnbfyw Pgn1AWVnAzrqmghDzAwj0paOGBdO3pLsjLjMAIpQCyMp89HCQCRQR/xLFswqNH2WHA3Y PrDPpDHVEqVCm6zGn1xmn0pmI1AsS40cv8wBSmF9gxpZKWw3kD3xf8FQlJhxRiKtaE5s 4n8Ltl1bVOT+3YpMWJ1zwhd6DdxDPWgRSRYSyD/bBBQr/SQ68JuAKNnlF9y26n9zAlSB /j5A== X-Gm-Message-State: AOAM531y+rJSU8FAI/p/cxy6gSSSpW5WaDiHTmW7H9DiYJl2Cn3KjLtn C89xMG5l7gjviZHroZfWeSxl/C77Pbc= X-Google-Smtp-Source: ABdhPJwYsFHTVJs5yFowOUTlGnDbk0R7NQETUHPlFRqbYiwLqLtyjeAXsmjjR5nu1KQb6JNT0kYxrw== X-Received: by 2002:a63:211a:: with SMTP id h26mr24749800pgh.239.1642543056090; Tue, 18 Jan 2022 13:57:36 -0800 (PST) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id me11sm3988008pjb.34.2022.01.18.13.57.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Jan 2022 13:57:33 -0800 (PST) Received: from gnu-tgl-3.. (localhost [IPv6:::1]) by gnu-tgl-3.localdomain (Postfix) with ESMTP id 07BB0C0614; Tue, 18 Jan 2022 13:57:32 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH v8 2/4] elf: Add a test for PT_LOAD segments with mixed p_align [BZ #28676] Date: Tue, 18 Jan 2022 13:57:29 -0800 Message-Id: <20220118215731.1320930-3-hjl.tools@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220118215731.1320930-1-hjl.tools@gmail.com> References: <20220118215731.1320930-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-p_alignmod-base.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 | 16 +++++ elf/tst-elf-edit.h | 126 +++++++++++++++++++++++++++++++++++++ elf/tst-p_align.h | 20 ++++++ elf/tst-p_align1.c | 27 ++++++++ elf/tst-p_alignmod-base.c | 41 ++++++++++++ elf/tst-p_alignmod1-edit.c | 34 ++++++++++ 6 files changed, 264 insertions(+) create mode 100644 elf/tst-elf-edit.h create mode 100644 elf/tst-p_align.h create mode 100644 elf/tst-p_align1.c create mode 100644 elf/tst-p_alignmod-base.c create mode 100644 elf/tst-p_alignmod1-edit.c diff --git a/elf/Makefile b/elf/Makefile index 692a65b061..94ebcab1fa 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -412,6 +412,8 @@ tests += \ tst-nodelete-opened \ tst-noload \ tst-null-argv \ + tst-p_alignmod1-edit \ + tst-p_align1 \ tst-relsort1 \ tst-ro-dynamic \ tst-rtld-run-static \ @@ -728,6 +730,7 @@ modules-names = \ tst-nodelete-dlclose-plugin \ tst-nodelete-opened-lib \ tst-null-argv-lib \ + tst-p_alignmod-base \ tst-relsort1mod1 \ tst-relsort1mod2 \ tst-ro-dynamic-mod \ @@ -2578,3 +2581,16 @@ 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_alignmod-base.so: $(libsupport) + +$(objpfx)tst-p_align1: $(objpfx)tst-p_alignmod1.so + +# Make a copy of tst-p_alignmod-base.so and lower p_align of the first +# PT_LOAD segment. +$(objpfx)tst-p_alignmod1.so: $(objpfx)tst-p_alignmod1-edit \ + $(objpfx)tst-p_alignmod-base.so + rm -f $@ + cp $(objpfx)tst-p_alignmod-base.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..b764e78933 --- /dev/null +++ b/elf/tst-elf-edit.h @@ -0,0 +1,126 @@ +/* Update p_align of the first PT_LOAD segment. + Copyright (C) 2022 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_align.h b/elf/tst-p_align.h new file mode 100644 index 0000000000..cef92330fb --- /dev/null +++ b/elf/tst-p_align.h @@ -0,0 +1,20 @@ +/* Prototypes to check different alignments of PT_LOAD segments in + a shared library. + Copyright (C) 2022 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); diff --git a/elf/tst-p_align1.c b/elf/tst-p_align1.c new file mode 100644 index 0000000000..961c7fbbf1 --- /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) 2022 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-p_align.h" + +static int +do_test (void) +{ + return do_load_test (); +} + +#include diff --git a/elf/tst-p_alignmod-base.c b/elf/tst-p_alignmod-base.c new file mode 100644 index 0000000000..0fc1b75523 --- /dev/null +++ b/elf/tst-p_alignmod-base.c @@ -0,0 +1,41 @@ +/* Check alignment of PT_LOAD segment in a shared library. + Copyright (C) 2022 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 "tst-p_align.h" + +int foo __attribute__ ((aligned (ALIGN))) = 1; + +bool +__attribute__ ((weak, noclone, noinline)) +is_aligned_p (void *p, int align) +{ + return (((uintptr_t) p) & (align - 1)) == 0; +} + +int +do_load_test (void) +{ + printf ("foo: %p\n", &foo); + TEST_VERIFY (is_aligned_p (&foo, ALIGN)); + return 0; +} diff --git a/elf/tst-p_alignmod1-edit.c b/elf/tst-p_alignmod1-edit.c new file mode 100644 index 0000000000..cdb453e696 --- /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) 2022 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 Tue Jan 18 21:57: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: 50195 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 7EA543858D39 for ; Tue, 18 Jan 2022 21:57:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7EA543858D39 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1642543075; bh=qu75BYjAM0FEwGdjVy9rhWuoJzlVSdTlPeliRepZhws=; 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=NMHWNiis7sCAPrxGIqRKEfE7XuKPL+WqDjVQYYoUGIjlGXk/lh8YrN6GsRjWOPW50 j4jXrQULrPdiEgE94ntW2VeRrKg5DWG1rRdoeTq6t7JwRfMjSERe4IXF3LyMfUyAEm diTxzDFPjOW4FzEDBwAlrZiwxvCGy/FnXniZ28m0= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pf1-x432.google.com (mail-pf1-x432.google.com [IPv6:2607:f8b0:4864:20::432]) by sourceware.org (Postfix) with ESMTPS id C41FD3858D39 for ; Tue, 18 Jan 2022 21:57:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C41FD3858D39 Received: by mail-pf1-x432.google.com with SMTP id x83so654659pfc.0 for ; Tue, 18 Jan 2022 13:57:34 -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=qu75BYjAM0FEwGdjVy9rhWuoJzlVSdTlPeliRepZhws=; b=zebeBE2mr6T9LcABLd5IH1q/0/BqOU52o6v6Cjxq0iGpY001YqocAZPOJpYwTwbpt7 yuL+y0mQXOSwgdU3HTewOkuDNinjRsYoufQANBal/UhXqICpGFBZXhTAuOeJH49+5Xy+ JNppFWsRjKOSkhBPUR8AqNqrwOMuPLmCVOerLdvFm4inM2N0s7u+AF9kzqVwGyEOeuS1 n4MpBW6gOVRPYZGN//jpyTx6nbxy8R1Zyh3u3xSDYWkGnKYOq/Pz3UxzXrBRPkFeb2Fj tQk8aYIY4tRR9dfj+Ju9vRbo1Cof6bbGjTZG6WpG5b5egzo7D3Uzh9jGm4O0yeGkjzU7 hqUg== X-Gm-Message-State: AOAM5301uBeYGdz3ij/7AAvdNQtZrgNUgiqVqQUiFFB3JQw/R/RPlMwd bpPho64fQZszo4ckgrQT27E= X-Google-Smtp-Source: ABdhPJyBrrZfQDpsP0EH51K0F7VPOjHb/Fhr9ArP1VVTLowy6SYHOox0Qhps95MxEpy1iGNlvlF3ZQ== X-Received: by 2002:aa7:8a19:0:b0:4c1:968c:3203 with SMTP id m25-20020aa78a19000000b004c1968c3203mr27395281pfa.42.1642543053836; Tue, 18 Jan 2022 13:57:33 -0800 (PST) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id q18sm19250114pfn.184.2022.01.18.13.57.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Jan 2022 13:57:33 -0800 (PST) Received: from gnu-tgl-3.. (localhost [IPv6:::1]) by gnu-tgl-3.localdomain (Postfix) with ESMTP id 090D8C0615; Tue, 18 Jan 2022 13:57:32 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH v8 3/4] elf: Add a test for PT_LOAD segments with p_align == 1 [BZ #28688] Date: Tue, 18 Jan 2022 13:57:30 -0800 Message-Id: <20220118215731.1320930-4-hjl.tools@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220118215731.1320930-1-hjl.tools@gmail.com> References: <20220118215731.1320930-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-p_alignmod-base.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 94ebcab1fa..92a6a3baf1 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -413,7 +413,9 @@ tests += \ tst-noload \ tst-null-argv \ tst-p_alignmod1-edit \ + tst-p_alignmod2-edit \ tst-p_align1 \ + tst-p_align2 \ tst-relsort1 \ tst-ro-dynamic \ tst-rtld-run-static \ @@ -2594,3 +2596,14 @@ $(objpfx)tst-p_alignmod1.so: $(objpfx)tst-p_alignmod1-edit \ cp $(objpfx)tst-p_alignmod-base.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-p_alignmod-base.so and update p_align of the first +# PT_LOAD segment. +$(objpfx)tst-p_alignmod2.so: $(objpfx)tst-p_alignmod2-edit \ + $(objpfx)tst-p_alignmod-base.so + rm -f $@ + cp $(objpfx)tst-p_alignmod-base.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..961c7fbbf1 --- /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) 2022 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-p_align.h" + +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..4c2ae65b4e --- /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) 2022 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 Tue Jan 18 21:57: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: 50199 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 7444E3858D39 for ; Tue, 18 Jan 2022 22:00:49 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7444E3858D39 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1642543249; bh=8U/FjwahXG6J11kzTODXQfUMxuoantdHaMIRbtq2Dz0=; 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=kCo2dgLjtpYutrwNzIipzGEWu/DhjkFbNFQiGhAcKYYBkNFUW4NhxBLEer85lRaLY ubVH2cMwS0fv5/I7Yh7/SdHuY0g0EXOUrA0v9FC2vfegIuvH4dMzYL7x9z0EKR/RoE gQLuIK4h0cvuEWA38dXhfbFreBO/HLAOmOTFdW5I= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pj1-x1036.google.com (mail-pj1-x1036.google.com [IPv6:2607:f8b0:4864:20::1036]) by sourceware.org (Postfix) with ESMTPS id 8B9F13857C5E for ; Tue, 18 Jan 2022 21:57:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8B9F13857C5E Received: by mail-pj1-x1036.google.com with SMTP id s61-20020a17090a69c300b001b4d0427ea2so3773096pjj.4 for ; Tue, 18 Jan 2022 13:57: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=8U/FjwahXG6J11kzTODXQfUMxuoantdHaMIRbtq2Dz0=; b=yaTTgFv8qcU0GhesgGqdKbO9YMVADTG6g8B4IO8ZZKbRF1vjcH9BlfzfU+UB9negMl QUhi4EdKPB/XmSVn2UoF+Nue64r+AAJ1NpMF4HVHIAvO5B/PLbSr69oq7070RLb8mKdh n+xQCKJ58IoUEcZS8kL4ucZ6AyPolWulE85USz9qXciyNWsYhBqudGUXEFgP8PuEEpUV m1MIGiTaHR1GEkFCZghHo4MjRhxt2qr2QpJAi5nIhSpYkTJJSdl3/pwMsFPOvWl64CIH tDYgVnjrnjgaVGU1DkUrb7wlrXIPjhHTS1IJwWcgWJzwHCQmJU3m4jdYTFv7odhztfwz PchA== X-Gm-Message-State: AOAM532PVkMM0Wkrliubj0bsbrH7NHZO3EK9ubOa5D1em1lAqN7+IJn/ uQXqWXUNhFnvXB8+WzZ2CMjuOG0QwHI= X-Google-Smtp-Source: ABdhPJy0/jQf7aVMnK6PioTIb3kjUMAn8lYOirIXzUhe8MuCYnqrNP69jHqJjiSjUserzkIWEzc00w== X-Received: by 2002:a17:90b:4a0e:: with SMTP id kk14mr696413pjb.12.1642543056645; Tue, 18 Jan 2022 13:57:36 -0800 (PST) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id k2sm19042217pfc.53.2022.01.18.13.57.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Jan 2022 13:57:34 -0800 (PST) Received: from gnu-tgl-3.. (localhost [IPv6:::1]) by gnu-tgl-3.localdomain (Postfix) with ESMTP id 13D44C068E; Tue, 18 Jan 2022 13:57:32 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH v8 4/4] elf: Add a test for PT_LOAD segments with invalid p_align [BZ #28688] Date: Tue, 18 Jan 2022 13:57:31 -0800 Message-Id: <20220118215731.1320930-5-hjl.tools@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220118215731.1320930-1-hjl.tools@gmail.com> References: <20220118215731.1320930-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 | 9 +++++++++ elf/tst-p_align3.c | 27 +++++++++++++++++++++++++++ elf/tst-p_align3.sh | 27 +++++++++++++++++++++++++++ elf/tst-p_alignmod3.c | 25 +++++++++++++++++++++++++ 4 files changed, 88 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 92a6a3baf1..d3232ce5ff 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -416,6 +416,7 @@ tests += \ tst-p_alignmod2-edit \ tst-p_align1 \ tst-p_align2 \ + tst-p_align3 \ tst-relsort1 \ tst-ro-dynamic \ tst-rtld-run-static \ @@ -733,6 +734,7 @@ modules-names = \ tst-nodelete-opened-lib \ tst-null-argv-lib \ tst-p_alignmod-base \ + tst-p_alignmod3 \ tst-relsort1mod1 \ tst-relsort1mod2 \ tst-ro-dynamic-mod \ @@ -2607,3 +2609,10 @@ $(objpfx)tst-p_alignmod2.so: $(objpfx)tst-p_alignmod2-edit \ cp $(objpfx)tst-p_alignmod-base.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..8be9f311bd --- /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) 2022 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-p_align.h" + +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..688c4b34cc --- /dev/null +++ b/elf/tst-p_align3.sh @@ -0,0 +1,27 @@ +#!/bin/sh +# Check invalid p_align of PT_LOAD segments in a shared library. +# Copyright (C) 2022 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 +test $? -ne 127 && 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..c15de3d6f2 --- /dev/null +++ b/elf/tst-p_alignmod3.c @@ -0,0 +1,25 @@ +/* Check invalid p_align of PT_LOAD segment in a shared library. + Copyright (C) 2022 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-p_align.h" + +int +do_load_test (void) +{ + return 0; +}