summaryrefslogtreecommitdiff
path: root/ldso/ldso/mips
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2002-05-09 08:34:43 +0000
committerEric Andersen <andersen@codepoet.org>2002-05-09 08:34:43 +0000
commit4a6cfe318094cc8b20e6e3003f417f8ab3563bb1 (patch)
treebcf21ad706140908f57c92ec07157f32e1c959c7 /ldso/ldso/mips
parent3942feca80e3b0f55f0f27004e05316d03d1dbe4 (diff)
Another mips patch from Steven J. Hill:
Uh, this patch fixes a few bugs that I overlooked. Shoot, even BusyBox wouldn't work until these are applied. Erik, plop this into CVS please. Thanks.
Diffstat (limited to 'ldso/ldso/mips')
-rw-r--r--ldso/ldso/mips/dl-sysdep.h8
-rw-r--r--ldso/ldso/mips/ld_sysdep.h8
-rw-r--r--ldso/ldso/mips/resolve.S14
3 files changed, 17 insertions, 13 deletions
diff --git a/ldso/ldso/mips/dl-sysdep.h b/ldso/ldso/mips/dl-sysdep.h
index f54e812b7..9d48d8f73 100644
--- a/ldso/ldso/mips/dl-sysdep.h
+++ b/ldso/ldso/mips/dl-sysdep.h
@@ -20,7 +20,7 @@
/*
- * Initialization sequence for the application GOT.
+ * Initialization sequence for the application or library GOT.
*/
#define INIT_GOT(GOT_BASE,MODULE) \
do { \
@@ -56,12 +56,12 @@ do { \
(unsigned long) MODULE->loadaddr; \
else { \
*GOT_BASE = (unsigned long) _dl_find_hash(strtab + \
- sym->st_name, MODULE->symbol_scope, NULL, 0); \
+ sym->st_name, MODULE->symbol_scope, NULL, 1); \
} \
} \
else if (sym->st_shndx == SHN_COMMON) { \
*GOT_BASE = (unsigned long) _dl_find_hash(strtab + \
- sym->st_name, MODULE->symbol_scope, NULL, 0); \
+ sym->st_name, MODULE->symbol_scope, NULL, 1); \
} \
else if (ELF32_ST_TYPE(sym->st_info) == STT_FUNC && \
*GOT_BASE != sym->st_value) \
@@ -72,7 +72,7 @@ do { \
} \
else { \
*GOT_BASE = (unsigned long) _dl_find_hash(strtab + \
- sym->st_name, MODULE->symbol_scope, NULL, 0); \
+ sym->st_name, MODULE->symbol_scope, NULL, 1); \
} \
\
++GOT_BASE; \
diff --git a/ldso/ldso/mips/ld_sysdep.h b/ldso/ldso/mips/ld_sysdep.h
index f54e812b7..9d48d8f73 100644
--- a/ldso/ldso/mips/ld_sysdep.h
+++ b/ldso/ldso/mips/ld_sysdep.h
@@ -20,7 +20,7 @@
/*
- * Initialization sequence for the application GOT.
+ * Initialization sequence for the application or library GOT.
*/
#define INIT_GOT(GOT_BASE,MODULE) \
do { \
@@ -56,12 +56,12 @@ do { \
(unsigned long) MODULE->loadaddr; \
else { \
*GOT_BASE = (unsigned long) _dl_find_hash(strtab + \
- sym->st_name, MODULE->symbol_scope, NULL, 0); \
+ sym->st_name, MODULE->symbol_scope, NULL, 1); \
} \
} \
else if (sym->st_shndx == SHN_COMMON) { \
*GOT_BASE = (unsigned long) _dl_find_hash(strtab + \
- sym->st_name, MODULE->symbol_scope, NULL, 0); \
+ sym->st_name, MODULE->symbol_scope, NULL, 1); \
} \
else if (ELF32_ST_TYPE(sym->st_info) == STT_FUNC && \
*GOT_BASE != sym->st_value) \
@@ -72,7 +72,7 @@ do { \
} \
else { \
*GOT_BASE = (unsigned long) _dl_find_hash(strtab + \
- sym->st_name, MODULE->symbol_scope, NULL, 0); \
+ sym->st_name, MODULE->symbol_scope, NULL, 1); \
} \
\
++GOT_BASE; \
diff --git a/ldso/ldso/mips/resolve.S b/ldso/ldso/mips/resolve.S
index b6dda82d7..f1d7cff76 100644
--- a/ldso/ldso/mips/resolve.S
+++ b/ldso/ldso/mips/resolve.S
@@ -23,18 +23,22 @@ _dl_linux_resolve:
addu $25, 8 # t9 ($25) now points at .cpload instruction
.cpload $25 # Compute GP
.set reorder
- subu $29, 32
- .cprestore 28
+ subu $29, 40
+ .cprestore 32
+ sw $15, 36($29)
sw $4, 16($29)
sw $5, 20($29)
- sw $15, 24($29)
+ sw $6, 24($29)
+ sw $7, 28($29)
move $4, $24
move $5, $3
jal _dl_linux_resolver
- lw $31, 24($29)
+ lw $31, 36($29)
lw $4, 16($29)
lw $5, 20($29)
- addu $29, 32
+ lw $6, 24($29)
+ lw $7, 28($29)
+ addu $29, 40
move $25, $2
jr $25
.size _dl_linux_resolve,.-_dl_linux_resolve