[PATCH] riscv: Change the relocations handled for RTLD_BOOTSTRAP
Fangrui Song
maskray@google.com
Wed Jun 15 23:07:37 GMT 2022
On 2022-06-05, Fangrui Song wrote:
>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.
>---
> 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);
>--
>2.36.1.255.ge46751e96f-goog
More information about the Libc-alpha
mailing list