From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7814) id 196093858407; Thu, 16 Jun 2022 01:42:06 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 196093858407 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Fangrui Song To: glibc-cvs@sourceware.org Subject: [glibc] riscv: Change the relocations handled for RTLD_BOOTSTRAP X-Act-Checkin: glibc X-Git-Author: Fangrui Song X-Git-Refname: refs/heads/master X-Git-Oldrev: 89a25c6f64746732b87eaf433af0964b564d4a92 X-Git-Newrev: 57919813e732dff2c6cfd1c95056cbc265058bc2 Message-Id: <20220616014206.196093858407@sourceware.org> Date: Thu, 16 Jun 2022 01:42:06 +0000 (GMT) X-BeenThere: glibc-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Glibc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 16 Jun 2022 01:42:06 -0000 https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=57919813e732dff2c6cfd1c95056cbc265058bc2 commit 57919813e732dff2c6cfd1c95056cbc265058bc2 Author: Fangrui Song Date: Wed Jun 15 18:42:03 2022 -0700 riscv: Change the relocations handled for RTLD_BOOTSTRAP The RTLD_BOOTSTRAP branch is used to relocate ld.so itself. It only needs to handle RELATIVE, GLOB_DAT, and the symbolic relocation type (R_RISCV_{32,64}). NONE and IRELATIVE can be removed. The code relies on ld.so having DT_RELACOUNT so that the RTLD_BOOTSTRAP branch does not need handle RELATIVE. Drop this minor size optimization for clarity. Acked-by: Palmer Dabbelt Diff: --- sysdeps/riscv/dl-machine.h | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/sysdeps/riscv/dl-machine.h b/sysdeps/riscv/dl-machine.h index 9e026ae011..a60a452952 100644 --- a/sysdeps/riscv/dl-machine.h +++ b/sysdeps/riscv/dl-machine.h @@ -181,7 +181,15 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], switch (r_type) { -#ifndef RTLD_BOOTSTRAP + case R_RISCV_RELATIVE: + *addr_field = map->l_addr + reloc->r_addend; + break; + case R_RISCV_JUMP_SLOT: + case __WORDSIZE == 64 ? R_RISCV_64 : R_RISCV_32: + *addr_field = value; + break; + +# ifndef RTLD_BOOTSTRAP case __WORDSIZE == 64 ? R_RISCV_TLS_DTPMOD64 : R_RISCV_TLS_DTPMOD32: if (sym_map) *addr_field = sym_map->l_tls_modid; @@ -232,13 +240,6 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], memcpy (reloc_addr, (void *)value, size); break; } -#endif - -#if !defined RTLD_BOOTSTRAP - case R_RISCV_RELATIVE: - *addr_field = map->l_addr + reloc->r_addend; - break; -#endif case R_RISCV_IRELATIVE: value = map->l_addr + reloc->r_addend; @@ -247,13 +248,9 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], *addr_field = value; break; - case R_RISCV_JUMP_SLOT: - case __WORDSIZE == 64 ? R_RISCV_64 : R_RISCV_32: - *addr_field = value; - break; - case R_RISCV_NONE: break; +# endif /* !RTLD_BOOTSTRAP */ default: _dl_reloc_bad_type (map, r_type, 0);