summaryrefslogtreecommitdiff
path: root/ldso/ldso/arm/elfinterp.c
diff options
context:
space:
mode:
authorJoakim Tjernlund <joakim.tjernlund@transmode.se>2004-09-23 07:00:45 +0000
committerJoakim Tjernlund <joakim.tjernlund@transmode.se>2004-09-23 07:00:45 +0000
commitea64c4b3c6fbf77577b7019182bc93cabe21fdd5 (patch)
treef78beaaff3a65188212a70a4dc35f28b9208306f /ldso/ldso/arm/elfinterp.c
parent6dfefd64985e6a6872aebf0c53a5f2c9da5b0da9 (diff)
Don't allow undefined global symbols to pass.
Move COPY relocs back to _dl_do_reloc().
Diffstat (limited to 'ldso/ldso/arm/elfinterp.c')
-rw-r--r--ldso/ldso/arm/elfinterp.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/ldso/ldso/arm/elfinterp.c b/ldso/ldso/arm/elfinterp.c
index cdf099d1f..9e0a6d702 100644
--- a/ldso/ldso/arm/elfinterp.c
+++ b/ldso/ldso/arm/elfinterp.c
@@ -285,8 +285,10 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope,
* have been intentional. We should not be linking local symbols
* here, so all bases should be covered.
*/
- if (!symbol_addr && ELF32_ST_BIND(symtab[symtab_index].st_info) == STB_GLOBAL) {
- goof++;
+ if (!symbol_addr && ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_WEAK) {
+ _dl_dprintf (2, "%s: can't resolve symbol '%s'\n",
+ _dl_progname, strtab + symtab[symtab_index].st_name);
+ _dl_exit (1);
}
}
@@ -340,14 +342,8 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope,
*reloc_addr += (unsigned long) tpnt->loadaddr;
break;
case R_ARM_COPY:
-#if 0
- /* Do this later */
- _dl_dprintf(2, "Doing copy for symbol ");
- if (symtab_index) _dl_dprintf(2, strtab + symtab[symtab_index].st_name);
- _dl_dprintf(2, "\n");
- _dl_memcpy((void *) symtab[symtab_index].st_value,
- (void *) symbol_addr, symtab[symtab_index].st_size);
-#endif
+ _dl_memcpy((void *) reloc_addr,
+ (void *) symbol_addr, symtab[symtab_index].st_size);
break;
default:
return -1; /*call _dl_exit(1) */
@@ -412,7 +408,7 @@ _dl_do_copy_reloc (struct elf_resolve *tpnt, struct dyn_elf *scope,
unsigned long *reloc_addr;
unsigned long symbol_addr;
int goof = 0;
-
+ return 0; /* disable now, remove later */
reloc_addr = (unsigned long *) (tpnt->loadaddr + (unsigned long) rpnt->r_offset);
reloc_type = ELF32_R_TYPE(rpnt->r_info);
if (reloc_type != R_ARM_COPY)