diff options
author | Joakim Tjernlund <joakim.tjernlund@transmode.se> | 2004-08-26 09:40:09 +0000 |
---|---|---|
committer | Joakim Tjernlund <joakim.tjernlund@transmode.se> | 2004-08-26 09:40:09 +0000 |
commit | 2c13012629aeedaa9280909128cc887e3f761eb1 (patch) | |
tree | f8d0215ea413d5ed9d3e3ec5e19870af099ebfac /ldso | |
parent | 2f025ae954d4f08ab8e47e293f1ed7543f5edb40 (diff) |
Stefan Allius writes:
"I fixed the _dl_parse_copy_information in the same way than for the
powerpc and it works fine for me.
You may luck at the patch for the powerpc/elfinterp.c, where I change
the paramter of a dl_dprintf statement. Now we use the same
parameters than for the relocation copy."
Arch mantainers, please do the same.
When all arches has been fixed, we can remove of _dl_parse_copy_information,
it is just a waste of CPU cycles.
Diffstat (limited to 'ldso')
-rw-r--r-- | ldso/ldso/powerpc/elfinterp.c | 2 | ||||
-rw-r--r-- | ldso/ldso/sh/elfinterp.c | 65 |
2 files changed, 14 insertions, 53 deletions
diff --git a/ldso/ldso/powerpc/elfinterp.c b/ldso/ldso/powerpc/elfinterp.c index 0666012cb..8f0d27172 100644 --- a/ldso/ldso/powerpc/elfinterp.c +++ b/ldso/ldso/powerpc/elfinterp.c @@ -333,7 +333,7 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope, if(_dl_debug_move) _dl_dprintf(_dl_debug_file,"\n%s move %x bytes from %x to %x", symname, symtab[symtab_index].st_size, - symbol_addr, symtab[symtab_index].st_value); + symbol_addr, reloc_addr); #endif _dl_memcpy((char *) reloc_addr, (char *) finaladdr, symtab[symtab_index].st_size); } diff --git a/ldso/ldso/sh/elfinterp.c b/ldso/ldso/sh/elfinterp.c index 55c567d31..3e4a36bac 100644 --- a/ldso/ldso/sh/elfinterp.c +++ b/ldso/ldso/sh/elfinterp.c @@ -280,8 +280,16 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope, case R_SH_NONE: break; case R_SH_COPY: - /* handled later on */ - break; + if (symbol_addr) { +#if defined (__SUPPORT_LD_DEBUG__) + if(_dl_debug_move) + _dl_dprintf(_dl_debug_file,"\n%s move %x bytes from %x to %x", + symname, symtab[symtab_index].st_size, + symbol_addr, reloc_addr); +#endif + _dl_memcpy((char *) reloc_addr, (char *) symbol_addr, symtab[symtab_index].st_size); + } + return 0; /* no further LD_DEBUG messages for copy relocs */ case R_SH_DIR32: case R_SH_GLOB_DAT: case R_SH_JMP_SLOT: @@ -342,53 +350,6 @@ _dl_do_lazy_reloc (struct elf_resolve *tpnt, struct dyn_elf *scope, } -/* This is done as a separate step, because there are cases where - information is first copied and later initialized. This results in - the wrong information being copied. Someone at Sun was complaining about - a bug in the handling of _COPY by SVr4, and this may in fact be what he - was talking about. Sigh. */ - -/* No, there are cases where the SVr4 linker fails to emit COPY relocs - at all */ -static int -_dl_do_copy_reloc (struct elf_resolve *tpnt, struct dyn_elf *scope, - ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab) -{ - int reloc_type; - int symtab_index; - unsigned long *reloc_addr; - unsigned long symbol_addr; - int goof = 0; - char*symname; - - reloc_addr = (unsigned long *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); - reloc_type = ELF32_R_TYPE(rpnt->r_info); - if (reloc_type != R_SH_COPY) - return 0; - symtab_index = ELF32_R_SYM(rpnt->r_info); - symbol_addr = 0; - symname = strtab + symtab[symtab_index].st_name; - - if (symtab_index) { - - symbol_addr = (unsigned long) _dl_find_hash(symname, scope, ELF_RTYPE_CLASS_COPY); - if (!symbol_addr) goof++; - } - if (!goof) { -#if defined (__SUPPORT_LD_DEBUG__) - if(_dl_debug_move) - _dl_dprintf(_dl_debug_file,"\n%s move %x bytes from %x to %x", - symname, symtab[symtab_index].st_size, - symbol_addr, symtab[symtab_index].st_value); -#endif - _dl_memcpy((char *) symtab[symtab_index].st_value, - (char *) symbol_addr, symtab[symtab_index].st_size); - } - - return goof; -} - - void _dl_parse_lazy_relocation_information(struct dyn_elf *rpnt, unsigned long rel_addr, unsigned long rel_size) { @@ -401,9 +362,9 @@ int _dl_parse_relocation_information(struct dyn_elf *rpnt, return _dl_parse(rpnt->dyn, rpnt->dyn->symbol_scope, rel_addr, rel_size, _dl_do_reloc); } -int _dl_parse_copy_information(struct dyn_elf *rpnt, - unsigned long rel_addr, unsigned long rel_size) +int _dl_parse_copy_information(struct dyn_elf __attribute__((unused))*rpnt, + unsigned long __attribute__((unused))rel_addr, unsigned long __attribute__((unused))rel_size) { - return _dl_parse(rpnt->dyn, rpnt->next, rel_addr, rel_size, _dl_do_copy_reloc); + return 0; } |