diff options
| author | David S. Miller <davem@davemloft.net> | 2019-11-02 13:12:51 -0700 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2019-11-02 13:54:56 -0700 |
| commit | d31e95585ca697fb31440c6fe30113adc85ecfbd (patch) | |
| tree | 4936ea0aaa6b2aeeee4db51e3c60d938c9b9ed96 /arch/s390/boot/startup.c | |
| parent | c23fcbbc6aa4e0bb615e8a7f23e1f32aec235a1c (diff) | |
| parent | 1204c70d9dcba31164f78ad5d8c88c42335d51f8 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
The only slightly tricky merge conflict was the netdevsim because the
mutex locking fix overlapped a lot of driver reload reorganization.
The rest were (relatively) trivial in nature.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/s390/boot/startup.c')
| -rw-r--r-- | arch/s390/boot/startup.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/arch/s390/boot/startup.c b/arch/s390/boot/startup.c index 596ca7cc4d7b..5367950510f6 100644 --- a/arch/s390/boot/startup.c +++ b/arch/s390/boot/startup.c @@ -101,10 +101,18 @@ static void handle_relocs(unsigned long offset) dynsym = (Elf64_Sym *) vmlinux.dynsym_start; for (rela = rela_start; rela < rela_end; rela++) { loc = rela->r_offset + offset; - val = rela->r_addend + offset; + val = rela->r_addend; r_sym = ELF64_R_SYM(rela->r_info); - if (r_sym) - val += dynsym[r_sym].st_value; + if (r_sym) { + if (dynsym[r_sym].st_shndx != SHN_UNDEF) + val += dynsym[r_sym].st_value + offset; + } else { + /* + * 0 == undefined symbol table index (STN_UNDEF), + * used for R_390_RELATIVE, only add KASLR offset + */ + val += offset; + } r_type = ELF64_R_TYPE(rela->r_info); rc = arch_kexec_do_relocs(r_type, (void *) loc, val, 0); if (rc) |