commit a818035cc044bcdd757d0f82224e7d1349a4f298 Author: Brandon Bergren Date: Tue Mar 17 12:56:54 2020 -0500 Dynamic parsing happens before relocation, so ef->lf->address isn't actually filled in yet. Change the MD parsing to pass the load base from ef instead of the empty lf object. diff --git a/sys/amd64/amd64/elf_machdep.c b/sys/amd64/amd64/elf_machdep.c index f5633e7ab0f..aefced635f0 100644 --- a/sys/amd64/amd64/elf_machdep.c +++ b/sys/amd64/amd64/elf_machdep.c @@ -331,7 +331,7 @@ elf_cpu_unload_file(linker_file_t lf __unused) } int -elf_cpu_parse_dynamic(linker_file_t lf __unused, Elf_Dyn *dynamic __unused) +elf_cpu_parse_dynamic(caddr_t loadbase __unused, Elf_Dyn *dynamic __unused) { return (0); diff --git a/sys/arm/arm/elf_machdep.c b/sys/arm/arm/elf_machdep.c index 9072441701b..a8a0647c722 100644 --- a/sys/arm/arm/elf_machdep.c +++ b/sys/arm/arm/elf_machdep.c @@ -327,7 +327,7 @@ elf_cpu_load_file(linker_file_t lf) } int -elf_cpu_parse_dynamic(linker_file_t lf __unused, Elf_Dyn *dynamic __unused) +elf_cpu_parse_dynamic(caddr_t loadbase __unused, Elf_Dyn *dynamic __unused) { return (0); diff --git a/sys/arm64/arm64/elf_machdep.c b/sys/arm64/arm64/elf_machdep.c index 834795bda6e..1bf7cda59a5 100644 --- a/sys/arm64/arm64/elf_machdep.c +++ b/sys/arm64/arm64/elf_machdep.c @@ -258,7 +258,7 @@ elf_cpu_unload_file(linker_file_t lf __unused) } int -elf_cpu_parse_dynamic(linker_file_t lf __unused, Elf_Dyn *dynamic __unused) +elf_cpu_parse_dynamic(caddr_t loadbase __unused, Elf_Dyn *dynamic __unused) { return (0); diff --git a/sys/i386/i386/elf_machdep.c b/sys/i386/i386/elf_machdep.c index e3fb206b21b..dad97504c4e 100644 --- a/sys/i386/i386/elf_machdep.c +++ b/sys/i386/i386/elf_machdep.c @@ -297,7 +297,7 @@ elf_cpu_unload_file(linker_file_t lf __unused) } int -elf_cpu_parse_dynamic(linker_file_t lf __unused, Elf_Dyn *dynamic __unused) +elf_cpu_parse_dynamic(caddr_t loadbase __unused, Elf_Dyn *dynamic __unused) { return (0); diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c index a5f706d1609..9d39d53ac33 100644 --- a/sys/kern/link_elf.c +++ b/sys/kern/link_elf.c @@ -622,7 +622,7 @@ parse_dynamic(elf_file_t ef) ef->ddbstrtab = ef->strtab; ef->ddbstrcnt = ef->strsz; - return elf_cpu_parse_dynamic(&ef->lf, ef->dynamic); + return elf_cpu_parse_dynamic(ef->address, ef->dynamic); } #define LS_PADDING 0x90909090 diff --git a/sys/mips/mips/elf_machdep.c b/sys/mips/mips/elf_machdep.c index 9a439644bff..c70bd3313e1 100644 --- a/sys/mips/mips/elf_machdep.c +++ b/sys/mips/mips/elf_machdep.c @@ -503,7 +503,7 @@ elf_cpu_unload_file(linker_file_t lf __unused) } int -elf_cpu_parse_dynamic(linker_file_t lf __unused, Elf_Dyn *dynamic __unused) +elf_cpu_parse_dynamic(caddr_t loadbase __unused, Elf_Dyn *dynamic __unused) { return (0); diff --git a/sys/powerpc/powerpc/elf32_machdep.c b/sys/powerpc/powerpc/elf32_machdep.c index 4ded8b12890..4ac1a0da9a2 100644 --- a/sys/powerpc/powerpc/elf32_machdep.c +++ b/sys/powerpc/powerpc/elf32_machdep.c @@ -403,7 +403,7 @@ ppc32_runtime_resolve() } int -elf_cpu_parse_dynamic(linker_file_t lf, Elf_Dyn *dynamic) +elf_cpu_parse_dynamic(caddr_t loadbase, Elf_Dyn *dynamic) { Elf_Dyn *dp; bool has_plt = false; @@ -414,7 +414,7 @@ elf_cpu_parse_dynamic(linker_file_t lf, Elf_Dyn *dynamic) switch (dp->d_tag) { case DT_PPC_GOT: secure_plt = true; - got = (Elf_Addr *)(lf->address + dp->d_un.d_ptr); + got = (Elf_Addr *)(loadbase + dp->d_un.d_ptr); /* Install runtime resolver canary. */ got[1] = (Elf_Addr)ppc32_runtime_resolve; got[2] = (Elf_Addr)0; diff --git a/sys/powerpc/powerpc/elf64_machdep.c b/sys/powerpc/powerpc/elf64_machdep.c index a98fe32ff7d..5cb5df71008 100644 --- a/sys/powerpc/powerpc/elf64_machdep.c +++ b/sys/powerpc/powerpc/elf64_machdep.c @@ -423,7 +423,7 @@ elf_cpu_unload_file(linker_file_t lf __unused) } int -elf_cpu_parse_dynamic(linker_file_t lf __unused, Elf_Dyn *dynamic __unused) +elf_cpu_parse_dynamic(caddr_t loadbase __unused, Elf_Dyn *dynamic __unused) { return (0); diff --git a/sys/riscv/riscv/elf_machdep.c b/sys/riscv/riscv/elf_machdep.c index 002b7235b9f..3c0852bede6 100644 --- a/sys/riscv/riscv/elf_machdep.c +++ b/sys/riscv/riscv/elf_machdep.c @@ -506,7 +506,7 @@ elf_cpu_unload_file(linker_file_t lf __unused) } int -elf_cpu_parse_dynamic(linker_file_t lf __unused, Elf_Dyn *dynamic __unused) +elf_cpu_parse_dynamic(caddr_t loadbase __unused, Elf_Dyn *dynamic __unused) { return (0); diff --git a/sys/sys/linker.h b/sys/sys/linker.h index ffa8f186533..3c75183006e 100644 --- a/sys/sys/linker.h +++ b/sys/sys/linker.h @@ -305,7 +305,7 @@ int linker_ctf_get(linker_file_t, linker_ctf_t *); int elf_cpu_load_file(linker_file_t); int elf_cpu_unload_file(linker_file_t); -int elf_cpu_parse_dynamic(linker_file_t, Elf_Dyn *); +int elf_cpu_parse_dynamic(caddr_t, Elf_Dyn *); /* values for type */ #define ELF_RELOC_REL 1