@@ -19,6 +19,11 @@ else version (CRuntime_UClibc) enum SharedELF = true;
19
19
else enum SharedELF = false ;
20
20
static if (SharedELF):
21
21
22
+ version (MIPS32 ) version = MIPS_Any;
23
+ version (MIPS64 ) version = MIPS_Any;
24
+ version (RISCV32 ) version = RISCV_Any;
25
+ version (RISCV64 ) version = RISCV_Any;
26
+
22
27
// debug = PRINTF;
23
28
import core.internal.elf.dl ;
24
29
import core.memory ;
@@ -725,17 +730,29 @@ version (Shared)
725
730
if (dyn.d_tag == DT_STRTAB )
726
731
{
727
732
version (CRuntime_Musl )
728
- strtab = cast ( const ( char ) * )(object.baseAddress + dyn.d_un.d_ptr); // relocate
733
+ enum relocate = true ;
729
734
else version (linux )
730
- strtab = cast (const (char )* )dyn.d_un.d_ptr;
735
+ {
736
+ // This might change in future glibc releases (after 2.29) as dynamic sections
737
+ // are not required to be read-only on RISC-V. This was copy & pasted from MIPS
738
+ // while upstreaming RISC-V support. Otherwise MIPS is the only arch which sets
739
+ // in glibc: #define DL_RO_DYN_SECTION 1
740
+ version (RISCV_Any) enum relocate = true ;
741
+ else version (MIPS_Any) enum relocate = true ;
742
+ else enum relocate = false ;
743
+ }
731
744
else version (FreeBSD )
732
- strtab = cast ( const ( char ) * )(object.baseAddress + dyn.d_un.d_ptr); // relocate
745
+ enum relocate = true ;
733
746
else version (NetBSD )
734
- strtab = cast ( const ( char ) * )(object.baseAddress + dyn.d_un.d_ptr); // relocate
747
+ enum relocate = true ;
735
748
else version (DragonFlyBSD )
736
- strtab = cast ( const ( char ) * )(object.baseAddress + dyn.d_un.d_ptr); // relocate
749
+ enum relocate = true ;
737
750
else
738
751
static assert (0 , " unimplemented" );
752
+
753
+ const base = relocate ? cast (const char * ) object.baseAddress : null ;
754
+ strtab = base + dyn.d_un.d_ptr;
755
+
739
756
break ;
740
757
}
741
758
}
@@ -875,9 +892,7 @@ else version (ARM)
875
892
enum TLS_DTV_OFFSET = 0x0 ;
876
893
else version (AArch64 )
877
894
enum TLS_DTV_OFFSET = 0x0 ;
878
- else version (RISCV32 )
879
- enum TLS_DTV_OFFSET = 0x800 ;
880
- else version (RISCV64 )
895
+ else version (RISCV_Any)
881
896
enum TLS_DTV_OFFSET = 0x800 ;
882
897
else version (HPPA )
883
898
enum TLS_DTV_OFFSET = 0x0 ;
@@ -889,9 +904,7 @@ else version (PPC)
889
904
enum TLS_DTV_OFFSET = 0x8000 ;
890
905
else version (PPC64 )
891
906
enum TLS_DTV_OFFSET = 0x8000 ;
892
- else version (MIPS32 )
893
- enum TLS_DTV_OFFSET = 0x8000 ;
894
- else version (MIPS64 )
907
+ else version (MIPS_Any)
895
908
enum TLS_DTV_OFFSET = 0x8000 ;
896
909
else
897
910
static assert ( false , " Platform not supported." );
0 commit comments