summaryrefslogtreecommitdiffstats
path: root/sys/powerpc
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2015-09-27 01:33:43 +0000
committerkib <kib@FreeBSD.org>2015-09-27 01:33:43 +0000
commitb44e8c14438c6602432ef5d490df5fd818d5a1db (patch)
tree606c7d952a5108145e2f9e88a6ecd9c4b0d13664 /sys/powerpc
parent8a6fcabbcf4777957124f6be9ba9dba42b68a9b7 (diff)
downloadFreeBSD-src-b44e8c14438c6602432ef5d490df5fd818d5a1db.zip
FreeBSD-src-b44e8c14438c6602432ef5d490df5fd818d5a1db.tar.gz
MFC r288000:
Add support for weak symbols to the kernel linkers.
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/powerpc/elf32_machdep.c15
-rw-r--r--sys/powerpc/powerpc/elf64_machdep.c9
2 files changed, 13 insertions, 11 deletions
diff --git a/sys/powerpc/powerpc/elf32_machdep.c b/sys/powerpc/powerpc/elf32_machdep.c
index dbe58df..c2094ff 100644
--- a/sys/powerpc/powerpc/elf32_machdep.c
+++ b/sys/powerpc/powerpc/elf32_machdep.c
@@ -164,6 +164,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
Elf_Addr addend;
Elf_Word rtype, symidx;
const Elf_Rela *rela;
+ int error;
switch (type) {
case ELF_RELOC_REL:
@@ -187,16 +188,16 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
break;
case R_PPC_ADDR32: /* word32 S + A */
- addr = lookup(lf, symidx, 1);
- if (addr == 0)
- return -1;
+ error = lookup(lf, symidx, 1, &addr);
+ if (error != 0)
+ return -1;
addr += addend;
*where = addr;
break;
case R_PPC_ADDR16_LO: /* #lo(S) */
- addr = lookup(lf, symidx, 1);
- if (addr == 0)
+ error = lookup(lf, symidx, 1, &addr);
+ if (error != 0)
return -1;
/*
* addend values are sometimes relative to sections
@@ -211,8 +212,8 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
break;
case R_PPC_ADDR16_HA: /* #ha(S) */
- addr = lookup(lf, symidx, 1);
- if (addr == 0)
+ error = lookup(lf, symidx, 1, &addr);
+ if (error != 0)
return -1;
/*
* addend values are sometimes relative to sections
diff --git a/sys/powerpc/powerpc/elf64_machdep.c b/sys/powerpc/powerpc/elf64_machdep.c
index 0c41a8d..3fcca47 100644
--- a/sys/powerpc/powerpc/elf64_machdep.c
+++ b/sys/powerpc/powerpc/elf64_machdep.c
@@ -135,6 +135,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
Elf_Addr addend;
Elf_Word rtype, symidx;
const Elf_Rela *rela;
+ int error;
switch (type) {
case ELF_RELOC_REL:
@@ -157,9 +158,9 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
break;
case R_PPC64_ADDR64: /* doubleword64 S + A */
- addr = lookup(lf, symidx, 1);
- if (addr == 0)
- return -1;
+ error = lookup(lf, symidx, 1, &addr);
+ if (error != 0)
+ return -1;
addr += addend;
*where = addr;
break;
@@ -169,7 +170,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
break;
case R_PPC_JMP_SLOT: /* function descriptor copy */
- addr = lookup(lf, symidx, 1);
+ lookup(lf, symidx, 1, &addr);
memcpy(where, (Elf_Addr *)addr, 3*sizeof(Elf_Addr));
__asm __volatile("dcbst 0,%0; sync" :: "r"(where) : "memory");
break;
OpenPOWER on IntegriCloud