diff options
author | Fangrui Song <maskray@google.com> | 2022-06-15 18:42:03 -0700 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2022-06-15 18:42:03 -0700 |
commit | 57919813e732dff2c6cfd1c95056cbc265058bc2 (patch) | |
tree | 5b354599bdf496f4fd7b360e019c103d20c616da /sysdeps/riscv/dl-machine.h | |
parent | 89a25c6f64746732b87eaf433af0964b564d4a92 (diff) | |
download | glibc-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.h | 23 |
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); |