aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/riscv/dl-machine.h
diff options
context:
space:
mode:
authorFangrui Song <maskray@google.com>2022-06-15 18:42:03 -0700
committerFangrui Song <maskray@google.com>2022-06-15 18:42:03 -0700
commit57919813e732dff2c6cfd1c95056cbc265058bc2 (patch)
tree5b354599bdf496f4fd7b360e019c103d20c616da /sysdeps/riscv/dl-machine.h
parent89a25c6f64746732b87eaf433af0964b564d4a92 (diff)
downloadglibc-57919813e732dff2c6cfd1c95056cbc265058bc2.zip
glibc-57919813e732dff2c6cfd1c95056cbc265058bc2.tar.gz
glibc-57919813e732dff2c6cfd1c95056cbc265058bc2.tar.bz2
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 <palmer@rivosinc.com>
Diffstat (limited to 'sysdeps/riscv/dl-machine.h')
-rw-r--r--sysdeps/riscv/dl-machine.h23
1 files changed, 10 insertions, 13 deletions
diff --git a/sysdeps/riscv/dl-machine.h b/sysdeps/riscv/dl-machine.h
index 9e026ae..a60a452 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);