summaryrefslogtreecommitdiffstats
path: root/sys/mips
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/mips
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/mips')
-rw-r--r--sys/mips/mips/elf_machdep.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/sys/mips/mips/elf_machdep.c b/sys/mips/mips/elf_machdep.c
index d374713..2e22281 100644
--- a/sys/mips/mips/elf_machdep.c
+++ b/sys/mips/mips/elf_machdep.c
@@ -174,6 +174,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
Elf_Word rtype = (Elf_Word)0, symidx;
const Elf_Rel *rel = NULL;
const Elf_Rela *rela = NULL;
+ int error;
/*
* Stash R_MIPS_HI16 info so we can use it when processing R_MIPS_LO16
@@ -213,8 +214,8 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
break;
case R_MIPS_32: /* S + A */
- addr = lookup(lf, symidx, 1);
- if (addr == 0)
+ error = lookup(lf, symidx, 1, &addr);
+ if (error != 0)
return (-1);
addr += addend;
if (*where != addr)
@@ -222,8 +223,8 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
break;
case R_MIPS_26: /* ((A << 2) | (P & 0xf0000000) + S) >> 2 */
- addr = lookup(lf, symidx, 1);
- if (addr == 0)
+ error = lookup(lf, symidx, 1, &addr);
+ if (error != 0)
return (-1);
addend &= 0x03ffffff;
@@ -241,8 +242,8 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
break;
case R_MIPS_64: /* S + A */
- addr = lookup(lf, symidx, 1);
- if (addr == 0)
+ error = lookup(lf, symidx, 1, &addr);
+ if (error != 0)
return (-1);
addr += addend;
if (*(Elf64_Addr*)where != addr)
@@ -251,8 +252,8 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
case R_MIPS_HI16: /* ((AHL + S) - ((short)(AHL + S)) >> 16 */
if (rela != NULL) {
- addr = lookup(lf, symidx, 1);
- if (addr == 0)
+ error = lookup(lf, symidx, 1, &addr);
+ if (error != 0)
return (-1);
addr += addend;
*where &= 0xffff0000;
@@ -266,8 +267,8 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
case R_MIPS_LO16: /* AHL + S */
if (rela != NULL) {
- addr = lookup(lf, symidx, 1);
- if (addr == 0)
+ error = lookup(lf, symidx, 1, &addr);
+ if (error != 0)
return (-1);
addr += addend;
*where &= 0xffff0000;
@@ -275,8 +276,8 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
}
else {
ahl += (int16_t)addend;
- addr = lookup(lf, symidx, 1);
- if (addr == 0)
+ error = lookup(lf, symidx, 1, &addr);
+ if (error != 0)
return (-1);
addend &= 0xffff0000;
@@ -292,8 +293,8 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
break;
case R_MIPS_HIGHER: /* %higher(A+S) */
- addr = lookup(lf, symidx, 1);
- if (addr == 0)
+ error = lookup(lf, symidx, 1, &addr);
+ if (error != 0)
return (-1);
addr += addend;
*where &= 0xffff0000;
@@ -301,8 +302,8 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
break;
case R_MIPS_HIGHEST: /* %highest(A+S) */
- addr = lookup(lf, symidx, 1);
- if (addr == 0)
+ error = lookup(lf, symidx, 1, &addr);
+ if (error != 0)
return (-1);
addr += addend;
*where &= 0xffff0000;
OpenPOWER on IntegriCloud