diff options
author | Roland McGrath <roland@gnu.org> | 2002-11-15 22:51:30 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2002-11-15 22:51:30 +0000 |
commit | 92712dee6828b76b2646d853328cf030eacd36b1 (patch) | |
tree | c47fb508e31e6fdd4fef2bea5f1e9808632ff402 /sysdeps | |
parent | 53da80ab8870138b81b212c540c32b5c1eeccaf4 (diff) | |
download | glibc-92712dee6828b76b2646d853328cf030eacd36b1.tar glibc-92712dee6828b76b2646d853328cf030eacd36b1.tar.gz glibc-92712dee6828b76b2646d853328cf030eacd36b1.tar.bz2 glibc-92712dee6828b76b2646d853328cf030eacd36b1.zip |
* sysdeps/i386/dl-machine.h (elf_machine_rela): Handle R_386_COPY.
* sysdeps/arm/dl-machine.h (elf_machine_rela): Handle R_ARM_COPY.
2002-11-15 Roland McGrath <roland@redhat.com>
* math/Makefile (libm-calls): Change s_ldexp to m_ldexp.
* Makerules ($(+sysdir_pfx)sysd-rules): Emit pattern rules for m_%.[Sc]
from sysdeps/.../s_%.[Sc] with commands $(+make-include-of-dep).
(+make-include-of-dep): New canned sequence.
* stdlib/canonicalize.c (__realpath): Check for malloc failure.
From Dmitry V. Levin <ldv@altlinux.org>.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/arm/dl-machine.h | 25 | ||||
-rw-r--r-- | sysdeps/i386/dl-machine.h | 26 |
2 files changed, 51 insertions, 0 deletions
diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h index e3e666a42f..074762e1f0 100644 --- a/sysdeps/arm/dl-machine.h +++ b/sysdeps/arm/dl-machine.h @@ -554,12 +554,37 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, return; else { +# ifndef RESOLVE_CONFLICT_FIND_MAP + const Elf32_Sym *const refsym = sym; +# endif Elf32_Addr value = RESOLVE (&sym, version, r_type); if (sym) value += sym->st_value; switch (r_type) { +# ifndef RESOLVE_CONFLICT_FIND_MAP + /* Not needed for dl-conflict.c. */ + case R_ARM_COPY: + if (sym == NULL) + /* This can happen in trace mode if an object could not be + found. */ + break; + if (sym->st_size > refsym->st_size + || (GL(dl_verbose) && sym->st_size < refsym->st_size)) + { + const char *strtab; + + strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]); + _dl_error_printf ("\ +%s: Symbol `%s' has different size in shared object, consider re-linking\n", + rtld_progname ?: "<program name unknown>", + strtab + refsym->st_name); + } + memcpy (reloc_addr, (void *) value, MIN (sym->st_size, + refsym->st_size)); + break; +# endif /* !RESOLVE_CONFLICT_FIND_MAP */ case R_ARM_GLOB_DAT: case R_ARM_JUMP_SLOT: case R_ARM_ABS32: diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h index 4aa07373f8..add6f8e01b 100644 --- a/sysdeps/i386/dl-machine.h +++ b/sysdeps/i386/dl-machine.h @@ -514,6 +514,9 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, *reloc_addr = map->l_addr + reloc->r_addend; else if (r_type != R_386_NONE) { +# ifndef RESOLVE_CONFLICT_FIND_MAP + const Elf32_Sym *const refsym = sym; +# endif # ifdef USE_TLS struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type); Elf32_Addr value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value; @@ -568,6 +571,29 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, CHECK_STATIC_TLS (map, sym_map); break; # endif /* use TLS */ +# ifndef RESOLVE_CONFLICT_FIND_MAP + /* Not needed for dl-conflict.c. */ + case R_386_COPY: + if (sym == NULL) + /* This can happen in trace mode if an object could not be + found. */ + break; + if (__builtin_expect (sym->st_size > refsym->st_size, 0) + || (__builtin_expect (sym->st_size < refsym->st_size, 0) + && GL(dl_verbose))) + { + const char *strtab; + + strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]); + _dl_error_printf ("\ +%s: Symbol `%s' has different size in shared object, consider re-linking\n", + rtld_progname ?: "<program name unknown>", + strtab + refsym->st_name); + } + memcpy (reloc_addr, (void *) value, MIN (sym->st_size, + refsym->st_size)); + break; +# endif /* !RESOLVE_CONFLICT_FIND_MAP */ default: /* We add these checks in the version to relocate ld.so only if we are still debugging. */ |