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