Skip to content

Commit ac49303

Browse files
gerald-schaeferVasily Gorbik
authored andcommitted
s390/kaslr: add support for R_390_GLOB_DAT relocation type
Commit "bpf: Process in-kernel BTF" in linux-next introduced an undefined __weak symbol, which results in an R_390_GLOB_DAT relocation type. That is not yet handled by the KASLR relocation code, and the kernel stops with the message "Unknown relocation type". Add code to detect and handle R_390_GLOB_DAT relocation types and undefined symbols. Fixes: 805bc0b ("s390/kernel: build a relocatable kernel") Cc: <[email protected]> # v5.2+ Acked-by: Heiko Carstens <[email protected]> Signed-off-by: Gerald Schaefer <[email protected]> Signed-off-by: Vasily Gorbik <[email protected]>
1 parent 388bb19 commit ac49303

File tree

2 files changed

+12
-3
lines changed

2 files changed

+12
-3
lines changed

arch/s390/boot/startup.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,18 @@ static void handle_relocs(unsigned long offset)
101101
dynsym = (Elf64_Sym *) vmlinux.dynsym_start;
102102
for (rela = rela_start; rela < rela_end; rela++) {
103103
loc = rela->r_offset + offset;
104-
val = rela->r_addend + offset;
104+
val = rela->r_addend;
105105
r_sym = ELF64_R_SYM(rela->r_info);
106-
if (r_sym)
107-
val += dynsym[r_sym].st_value;
106+
if (r_sym) {
107+
if (dynsym[r_sym].st_shndx != SHN_UNDEF)
108+
val += dynsym[r_sym].st_value + offset;
109+
} else {
110+
/*
111+
* 0 == undefined symbol table index (STN_UNDEF),
112+
* used for R_390_RELATIVE, only add KASLR offset
113+
*/
114+
val += offset;
115+
}
108116
r_type = ELF64_R_TYPE(rela->r_info);
109117
rc = arch_kexec_do_relocs(r_type, (void *) loc, val, 0);
110118
if (rc)

arch/s390/kernel/machine_kexec_reloc.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ int arch_kexec_do_relocs(int r_type, void *loc, unsigned long val,
2727
*(u32 *)loc = val;
2828
break;
2929
case R_390_64: /* Direct 64 bit. */
30+
case R_390_GLOB_DAT:
3031
*(u64 *)loc = val;
3132
break;
3233
case R_390_PC16: /* PC relative 16 bit. */

0 commit comments

Comments
 (0)