From patchwork Sat Jan 8 18:38: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: 1577298 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=ZH2VDYtQ; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4JWTck5wHYz9sCD for ; Sun, 9 Jan 2022 05:48:22 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 91D6E386EC66 for ; Sat, 8 Jan 2022 18:48:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 91D6E386EC66 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1641667700; bh=L4WKGi545mvIvo8hsdoICZFadzIdSHk7vmo8aB+0VxM=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=ZH2VDYtQFzFgci1PL65F12ghWsnSQF6yazYMS2T6M+IqDQ9WX5UvudG0VGEDYnIT9 IaEWcMzY9ExvBkMJ39KWPr5sFljuuQVp/eRNLP60mZuu+2OAiJrljShFQq6JE/WvzD iT4qTSm239dOW0SoF6x/ym22CyzpzV/QcPDA1dhc= 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 11944386EC47; Sat, 8 Jan 2022 18:38:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 11944386EC47 Received: by mail-pj1-x1036.google.com with SMTP id ie23-20020a17090b401700b001b38a5318easo1902617pjb.2; Sat, 08 Jan 2022 10:38:42 -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:mime-version :content-transfer-encoding; bh=L4WKGi545mvIvo8hsdoICZFadzIdSHk7vmo8aB+0VxM=; b=aSO7qh/JbfXxictQciIvwkDqUWvVnoU828PCQZJN0YX/6votcz1X4jW6gf/BzzEu5z pu1XOtywfGYiyRv3m2lf1Qsghfe5HsKOkwOGycYGbXAAhgMkzYZvH+GOhvKGgtN0wV1l DfVWOsdNCNAemgdXSch0xumCB57XmJMmbUgqpGSKwjurZzDLKJTNFqcZ5rjOuSweecGp faPeHj97n/bs3PwX9/GaH8CxuEurFs6GLn5zZ56xF2EDCMuaWp/zsz1x80soOpxQ5ftS FW/QZrIVkTs6BhVwZXqh3SHL1ZnnRcdOwiMRgu5dMtW85PsF8uxNOi8g9uMkaNBlpDh7 D8vQ== X-Gm-Message-State: AOAM530pXLHCXAeMNTPb39v6umlM4TLKw5ie3slldRna7NRfycpf+e7l adolWnNR7iZ54iY5QsbZwt0g+iSrkmg= X-Google-Smtp-Source: ABdhPJx312siM25c2OfkQF0lHiIhJ7Q/clBmhKgWcdpeSZhiR5FLMds6RyjRc/VuYiLpOdtBU5DYWQ== X-Received: by 2002:a17:90a:6683:: with SMTP id m3mr2807586pjj.172.1641667121119; Sat, 08 Jan 2022 10:38:41 -0800 (PST) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id q13sm2712964pfj.65.2022.01.08.10.38.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 10:38:40 -0800 (PST) Received: from gnu-tgl-3.. (localhost [IPv6:::1]) by gnu-tgl-3.localdomain (Postfix) with ESMTP id 09429C07B0; Sat, 8 Jan 2022 10:38:39 -0800 (PST) To: binutils@sourceware.org Subject: [PATCH v2 0/9] ld: Implement DT_RELR for x86 Date: Sat, 8 Jan 2022 10:38:29 -0800 Message-Id: <20220108183838.1920397-1-hjl.tools@gmail.com> X-Mailer: git-send-email 2.33.1 MIME-Version: 1.0 X-Spam-Status: No, score=-3020.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, KAM_NUMSUBJECT, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=no 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: libc-alpha@sourceware.org, Nick Clifton , Alan Modra Errors-To: libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org Sender: "Libc-alpha" Hi Nick, I'd like to enable DT_RELR for x86 in binutils 2.38. H.J. Reviewed-by: Fangrui Song --- Changes in v2: 1. Drop the _bfd_elf_link_iterate_on_relocs patch, which has been checked into master branch. 2. Also pack R_*_RELATIVE relocations against dynamic symbols. 3. Skip relocation against IFUNC symbol earlier. 4. Don't require the --relax option enabled. 5. Add more DT_RELR tests: a. Add a test with relative relocation in section with 1-byte alignment. b. Add a test with -z pack-relative-relocs --no-relax. c. Add tests for packing R_*_RELATIVE relocations against dynamic symbols. DT_RELR encodes consecutive R_*_RELATIVE relocations in GOT (the global offset table) and data sections in a compact format: https://groups.google.com/g/generic-abi/c/bX460iggiKg On some targets, R_*_RELATIVE relocations are counted and the GOT offsets are allocated when setting the dynamic section sizes after seeing all relocations. R_*_RELATIVE relocations are generated while relocating sections after section layout has been finalized. For x86 targets, the old check_relocs is renamed to scan_relocs and a new check_relocs is added to chek input sections and create dynamic relocation sections so that they will be mapped to output sections. scan_relocs is now called from elf_backend_always_size_sections. On some targets, the DT_RELR section size can be computed only after all symbols addresses can be determined: 1. Update ldelf_map_segments to pass need_layout to _bfd_elf_map_sections_to_segments which will size DT_RELR section and set need_layout to true if the DT_RELR section size is changed. 2. Set the preliminary DT_RELR section size before mapping sections to segments and set the final DT_RELR section size after regular symbol processing is done. On x86, DT_RELR is implemented with linker relaxation: 1. During linker relaxation, we scan input relocations with the same logic in relocate_section to determine if a relative relocation should be generated and save the relative relocation candidate information for sizing the DT_RELR section later after all symbols addresses can be determined. For these relative relocations which can't be placed in the DT_RELR section, they will be placed in the rela.dyn/rel.dyn section. 2. When DT_RELR is enabled, _bfd_elf_map_sections_to_segments calls a backend function to size the DT_RELR section which will compute the DT_RELR section size and tell ldelf_map_segments to layout sections again when the DT_RELR section size has been increased. 3. After regular symbol processing is finished, bfd_elf_final_link calls a backend function to finish the DT_RELR section. When DT_RELR is enabled, to avoid random run-time crash with older glibc binaries without DT_RELR support, add a GLIBC_ABI_DT_RELR symbol version, which is provided by glibc with DT_RELR support, dependency on the shared C library if it provides a GLIBC_2.XX symbol version. It can build DT_RELR enabled glibc successfully on x86-64, x32 and i686. H.J. Lu (9): elf: Add .relr.dyn to special_sections_r elf: Extract _bfd_elf_process_reverse_copy elf: Pass need_layout to _bfd_elf_map_sections_to_segments ld: Initial DT_RELR support elf: Add size_relative_relocs and finish_relative_relocs elf: Support DT_RELR in linker tests x86: Add DT_RELR support ld: Add simple DT_RELR tests ld: Add glibc dependency for DT_RELR bfd/elf-bfd.h | 15 +- bfd/elf.c | 22 +- bfd/elf32-i386.c | 77 +- bfd/elf64-x86-64.c | 92 +- bfd/elflink.c | 168 ++- bfd/elfxx-target.h | 8 + bfd/elfxx-x86.c | 954 ++++++++++++++++++ bfd/elfxx-x86.h | 147 ++- binutils/testsuite/lib/binutils-common.exp | 1 + include/bfdlink.h | 4 + ld/NEWS | 3 + ld/emulparams/dt-relr.sh | 21 + ld/emulparams/elf32_x86_64.sh | 1 + ld/emulparams/elf_i386.sh | 1 + ld/emulparams/elf_x86_64.sh | 1 + ld/emultempl/elf.em | 5 +- ld/ld.texi | 13 + ld/ldelf.c | 9 + ld/ldelfgen.c | 3 +- ld/ldlang.c | 3 +- ld/scripttempl/elf.sc | 4 + ld/testsuite/config/default.exp | 16 + ld/testsuite/ld-elf/dt-relr-1.s | 13 + ld/testsuite/ld-elf/dt-relr-1a.d | 10 + ld/testsuite/ld-elf/dt-relr-1b.d | 9 + ld/testsuite/ld-elf/dt-relr-1c.d | 9 + ld/testsuite/ld-elf/dt-relr-2.s | 20 + ld/testsuite/ld-elf/dt-relr-2a.d | 10 + ld/testsuite/ld-elf/dt-relr-2b.d | 17 + ld/testsuite/ld-elf/dt-relr-2c.d | 17 + ld/testsuite/ld-elf/dt-relr-2d.d | 17 + ld/testsuite/ld-elf/dt-relr-2e.d | 9 + ld/testsuite/ld-elf/dt-relr-2f.d | 8 + ld/testsuite/ld-elf/dt-relr-2g.d | 9 + ld/testsuite/ld-elf/dt-relr-2h.d | 9 + ld/testsuite/ld-elf/dt-relr-3.s | 12 + ld/testsuite/ld-elf/dt-relr-3a.d | 9 + ld/testsuite/ld-elf/dt-relr-3b.d | 9 + ld/testsuite/ld-elf/dt-relr-glibc-1.c | 11 + ld/testsuite/ld-elf/dt-relr-glibc-1a.rd | 4 + ld/testsuite/ld-elf/dt-relr-glibc-1b.rd | 7 + ld/testsuite/ld-elf/dt-relr.exp | 44 + ld/testsuite/ld-elf/shared.exp | 3 +- ld/testsuite/ld-i386/dt-relr-1.d | 14 + ld/testsuite/ld-i386/dt-relr-1.s | 3 + ld/testsuite/ld-i386/export-class.exp | 2 +- ld/testsuite/ld-i386/i386.exp | 21 +- ld/testsuite/ld-i386/ibt-plt-2a.d | 2 +- ld/testsuite/ld-i386/ibt-plt-3a.d | 2 +- ld/testsuite/ld-i386/ibt-plt-3c.d | 2 +- ld/testsuite/ld-i386/pr26869.d | 2 +- ld/testsuite/ld-i386/report-reloc-1.d | 2 +- ld/testsuite/ld-ifunc/ifunc-2-i386-now.d | 2 +- .../ld-ifunc/ifunc-2-local-i386-now.d | 2 +- .../ld-ifunc/ifunc-2-local-x86-64-now.d | 2 +- ld/testsuite/ld-ifunc/ifunc-2-x86-64-now.d | 2 +- ld/testsuite/ld-ifunc/pr17154-x86-64-now.d | 2 +- ld/testsuite/ld-ifunc/pr17154-x86-64.d | 2 +- ld/testsuite/ld-x86-64/bnd-branch-1-now.d | 2 +- ld/testsuite/ld-x86-64/bnd-ifunc-1-now.d | 2 +- ld/testsuite/ld-x86-64/bnd-ifunc-2-now.d | 2 +- ld/testsuite/ld-x86-64/bnd-ifunc-2.d | 2 +- ld/testsuite/ld-x86-64/bnd-plt-1-now.d | 2 +- ld/testsuite/ld-x86-64/bnd-plt-1.d | 2 +- ld/testsuite/ld-x86-64/dt-relr-1-x32.d | 15 + ld/testsuite/ld-x86-64/dt-relr-1.d | 14 + ld/testsuite/ld-x86-64/dt-relr-1.s | 3 + ld/testsuite/ld-x86-64/export-class.exp | 3 +- ld/testsuite/ld-x86-64/ibt-plt-2a-x32.d | 2 +- ld/testsuite/ld-x86-64/ibt-plt-2a.d | 2 +- ld/testsuite/ld-x86-64/ibt-plt-3a-x32.d | 2 +- ld/testsuite/ld-x86-64/ibt-plt-3a.d | 2 +- ld/testsuite/ld-x86-64/ilp32-4.d | 2 +- ld/testsuite/ld-x86-64/load1c.d | 2 +- ld/testsuite/ld-x86-64/load1d.d | 2 +- ld/testsuite/ld-x86-64/pr13082-2b.d | 2 +- ld/testsuite/ld-x86-64/pr14207.d | 2 +- ld/testsuite/ld-x86-64/pr18176.d | 2 +- ld/testsuite/ld-x86-64/pr19162.d | 2 +- ld/testsuite/ld-x86-64/pr19636-2d.d | 2 +- ld/testsuite/ld-x86-64/pr19636-2l.d | 2 +- ld/testsuite/ld-x86-64/pr20253-1d.d | 2 +- ld/testsuite/ld-x86-64/pr20253-1f.d | 2 +- ld/testsuite/ld-x86-64/pr20253-1j.d | 2 +- ld/testsuite/ld-x86-64/pr20253-1l.d | 2 +- ld/testsuite/ld-x86-64/report-reloc-1-x32.d | 2 +- ld/testsuite/ld-x86-64/report-reloc-1.d | 2 +- ld/testsuite/ld-x86-64/x86-64.exp | 67 +- 88 files changed, 1883 insertions(+), 155 deletions(-) create mode 100644 ld/emulparams/dt-relr.sh create mode 100644 ld/testsuite/ld-elf/dt-relr-1.s create mode 100644 ld/testsuite/ld-elf/dt-relr-1a.d create mode 100644 ld/testsuite/ld-elf/dt-relr-1b.d create mode 100644 ld/testsuite/ld-elf/dt-relr-1c.d create mode 100644 ld/testsuite/ld-elf/dt-relr-2.s create mode 100644 ld/testsuite/ld-elf/dt-relr-2a.d create mode 100644 ld/testsuite/ld-elf/dt-relr-2b.d create mode 100644 ld/testsuite/ld-elf/dt-relr-2c.d create mode 100644 ld/testsuite/ld-elf/dt-relr-2d.d create mode 100644 ld/testsuite/ld-elf/dt-relr-2e.d create mode 100644 ld/testsuite/ld-elf/dt-relr-2f.d create mode 100644 ld/testsuite/ld-elf/dt-relr-2g.d create mode 100644 ld/testsuite/ld-elf/dt-relr-2h.d create mode 100644 ld/testsuite/ld-elf/dt-relr-3.s create mode 100644 ld/testsuite/ld-elf/dt-relr-3a.d create mode 100644 ld/testsuite/ld-elf/dt-relr-3b.d create mode 100644 ld/testsuite/ld-elf/dt-relr-glibc-1.c create mode 100644 ld/testsuite/ld-elf/dt-relr-glibc-1a.rd create mode 100644 ld/testsuite/ld-elf/dt-relr-glibc-1b.rd create mode 100644 ld/testsuite/ld-elf/dt-relr.exp create mode 100644 ld/testsuite/ld-i386/dt-relr-1.d create mode 100644 ld/testsuite/ld-i386/dt-relr-1.s create mode 100644 ld/testsuite/ld-x86-64/dt-relr-1-x32.d create mode 100644 ld/testsuite/ld-x86-64/dt-relr-1.d create mode 100644 ld/testsuite/ld-x86-64/dt-relr-1.s