SOURCES: glibc-sparc64-dl-machine.patch - previous one shouldn't b...
qboosh
qboosh at pld-linux.org
Tue Dec 27 01:17:30 CET 2005
Author: qboosh Date: Tue Dec 27 00:17:30 2005 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- previous one shouldn't be needed now; this one is needed for gcc 4.x (backported from CVS HEAD)
---- Files affected:
SOURCES:
glibc-sparc64-dl-machine.patch (1.1 -> 1.2)
---- Diffs:
================================================================
Index: SOURCES/glibc-sparc64-dl-machine.patch
diff -u SOURCES/glibc-sparc64-dl-machine.patch:1.1 SOURCES/glibc-sparc64-dl-machine.patch:1.2
--- SOURCES/glibc-sparc64-dl-machine.patch:1.1 Sun Jun 20 16:28:19 2004
+++ SOURCES/glibc-sparc64-dl-machine.patch Tue Dec 27 01:17:25 2005
@@ -1,29 +1,477 @@
-See http://gcc.gnu.org/PR15345
-
-Quick kludge by H.J.Lu
-Works around gcc-3.4.0 error which shows up when building glibc-2.3.2 for sparc64:
-
-.../sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/libc.a(dl-reloc.o)(.text+0x4b4): In function `elf_machine_load_address.3':
-: undefined reference to `_DYNAMIC'
-collect2: ld returned 1 exit status
-make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/elf/sln] Error 1
-
-
---- glibc-2.3.2/sysdeps/sparc/sparc64/dl-machine.h.orig Sat May 8 20:54:26 2004
-+++ glibc-2.3.2/sysdeps/sparc/sparc64/dl-machine.h Sat May 8 17:18:04 2004
-@@ -65,6 +65,7 @@
- }
+--- glibc-2.3.6/sysdeps/sparc/sparc64/dl-machine.h.orig 2005-12-27 01:19:34.023832576 +0100
++++ glibc-2.3.6/sysdeps/sparc/sparc64/dl-machine.h 2005-12-27 01:19:26.440985344 +0100
+@@ -18,6 +18,9 @@
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
++#ifndef dl_machine_h
++#define dl_machine_h
++
+ #define ELF_MACHINE_NAME "sparc64"
- /* Return the run-time load address of the shared object. */
-+#ifdef IS_IN_rtld
- static inline Elf64_Addr
- elf_machine_load_address (void)
- {
-@@ -84,6 +85,7 @@
- pc[3]*4 is l_addr + _GLOBAL_OFFSET_TABLE_ - (long)pc - 12 */
- return (Elf64_Addr) got - *got + (Elf32_Sword) ((pc[2] - pc[3]) * 4) - 4;
+ #include <string.h>
+@@ -233,232 +236,6 @@
+ return value;
}
-+#endif
- /* We have 4 cases to handle. And we code different code sequences
- for each one. I love V9 code models... */
+-#ifdef RESOLVE
+-
+-/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+- MAP is the object containing the reloc. */
+-
+-auto inline void
+-__attribute__ ((always_inline))
+-elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
+- const Elf64_Sym *sym, const struct r_found_version *version,
+- void *const reloc_addr_arg)
+-{
+- Elf64_Addr *const reloc_addr = reloc_addr_arg;
+- const unsigned long int r_type = ELF64_R_TYPE_ID (reloc->r_info);
+-
+-#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
+- if (__builtin_expect (r_type == R_SPARC_RELATIVE, 0))
+- *reloc_addr = map->l_addr + reloc->r_addend;
+-# ifndef RTLD_BOOTSTRAP
+- else if (r_type == R_SPARC_NONE) /* Who is Wilbur? */
+- return;
+-# endif
+- else
+-#endif
+- {
+-#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP
+- const Elf64_Sym *const refsym = sym;
+-#endif
+- Elf64_Addr value;
+-#ifndef RESOLVE_CONFLICT_FIND_MAP
+- if (sym->st_shndx != SHN_UNDEF &&
+- ELF64_ST_BIND (sym->st_info) == STB_LOCAL)
+- value = map->l_addr;
+- else
+- {
+- value = RESOLVE (&sym, version, r_type);
+- if (sym)
+- value += sym->st_value;
+- }
+-#else
+- value = 0;
+-#endif
+- value += reloc->r_addend; /* Assume copy relocs have zero addend. */
+-
+- switch (r_type)
+- {
+-#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP
+- case R_SPARC_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
+- || (GLRO(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_arg, (void *) value,
+- MIN (sym->st_size, refsym->st_size));
+- break;
+-#endif
+- case R_SPARC_64:
+- case R_SPARC_GLOB_DAT:
+- *reloc_addr = value;
+- break;
+-#ifndef RTLD_BOOTSTRAP
+- case R_SPARC_8:
+- *(char *) reloc_addr = value;
+- break;
+- case R_SPARC_16:
+- *(short *) reloc_addr = value;
+- break;
+- case R_SPARC_32:
+- *(unsigned int *) reloc_addr = value;
+- break;
+- case R_SPARC_DISP8:
+- *(char *) reloc_addr = (value - (Elf64_Addr) reloc_addr);
+- break;
+- case R_SPARC_DISP16:
+- *(short *) reloc_addr = (value - (Elf64_Addr) reloc_addr);
+- break;
+- case R_SPARC_DISP32:
+- *(unsigned int *) reloc_addr = (value - (Elf64_Addr) reloc_addr);
+- break;
+- case R_SPARC_WDISP30:
+- *(unsigned int *) reloc_addr =
+- ((*(unsigned int *)reloc_addr & 0xc0000000) |
+- ((value - (Elf64_Addr) reloc_addr) >> 2));
+- break;
+-
+- /* MEDLOW code model relocs */
+- case R_SPARC_LO10:
+- *(unsigned int *) reloc_addr =
+- ((*(unsigned int *)reloc_addr & ~0x3ff) |
+- (value & 0x3ff));
+- break;
+- case R_SPARC_HI22:
+- *(unsigned int *) reloc_addr =
+- ((*(unsigned int *)reloc_addr & 0xffc00000) |
+- (value >> 10));
+- break;
+- case R_SPARC_OLO10:
+- *(unsigned int *) reloc_addr =
+- ((*(unsigned int *)reloc_addr & ~0x1fff) |
+- (((value & 0x3ff) + ELF64_R_TYPE_DATA (reloc->r_info)) & 0x1fff));
+- break;
+-
+- /* MEDMID code model relocs */
+- case R_SPARC_H44:
+- *(unsigned int *) reloc_addr =
+- ((*(unsigned int *)reloc_addr & 0xffc00000) |
+- (value >> 22));
+- break;
+- case R_SPARC_M44:
+- *(unsigned int *) reloc_addr =
+- ((*(unsigned int *)reloc_addr & ~0x3ff) |
+- ((value >> 12) & 0x3ff));
+- break;
+- case R_SPARC_L44:
+- *(unsigned int *) reloc_addr =
+- ((*(unsigned int *)reloc_addr & ~0xfff) |
+- (value & 0xfff));
+- break;
+-
+- /* MEDANY code model relocs */
+- case R_SPARC_HH22:
+- *(unsigned int *) reloc_addr =
+- ((*(unsigned int *)reloc_addr & 0xffc00000) |
+- (value >> 42));
+- break;
+- case R_SPARC_HM10:
+- *(unsigned int *) reloc_addr =
+- ((*(unsigned int *)reloc_addr & ~0x3ff) |
+- ((value >> 32) & 0x3ff));
+- break;
+- case R_SPARC_LM22:
+- *(unsigned int *) reloc_addr =
+- ((*(unsigned int *)reloc_addr & 0xffc00000) |
+- ((value >> 10) & 0x003fffff));
+- break;
+-#endif
+- case R_SPARC_JMP_SLOT:
+-#ifdef RESOLVE_CONFLICT_FIND_MAP
+- /* R_SPARC_JMP_SLOT conflicts against .plt[32768+]
+- relocs should be turned into R_SPARC_64 relocs
+- in .gnu.conflict section.
+- r_addend non-zero does not mean it is a .plt[32768+]
+- reloc, instead it is the actual address of the function
+- to call. */
+- sparc64_fixup_plt (NULL, reloc, reloc_addr, value, 0, 0);
+-#else
+- sparc64_fixup_plt (map, reloc, reloc_addr, value,
+- reloc->r_addend, 0);
+-#endif
+- break;
+-#ifndef RTLD_BOOTSTRAP
+- case R_SPARC_UA16:
+- ((unsigned char *) reloc_addr_arg) [0] = value >> 8;
+- ((unsigned char *) reloc_addr_arg) [1] = value;
+- break;
+- case R_SPARC_UA32:
+- ((unsigned char *) reloc_addr_arg) [0] = value >> 24;
+- ((unsigned char *) reloc_addr_arg) [1] = value >> 16;
+- ((unsigned char *) reloc_addr_arg) [2] = value >> 8;
+- ((unsigned char *) reloc_addr_arg) [3] = value;
+- break;
+- case R_SPARC_UA64:
+- if (! ((long) reloc_addr_arg & 3))
+- {
+- /* Common in .eh_frame */
+- ((unsigned int *) reloc_addr_arg) [0] = value >> 32;
+- ((unsigned int *) reloc_addr_arg) [1] = value;
+- break;
+- }
+- ((unsigned char *) reloc_addr_arg) [0] = value >> 56;
+- ((unsigned char *) reloc_addr_arg) [1] = value >> 48;
+- ((unsigned char *) reloc_addr_arg) [2] = value >> 40;
+- ((unsigned char *) reloc_addr_arg) [3] = value >> 32;
+- ((unsigned char *) reloc_addr_arg) [4] = value >> 24;
+- ((unsigned char *) reloc_addr_arg) [5] = value >> 16;
+- ((unsigned char *) reloc_addr_arg) [6] = value >> 8;
+- ((unsigned char *) reloc_addr_arg) [7] = value;
+- break;
+-#endif
+-#if !defined RTLD_BOOTSTRAP || defined _NDEBUG
+- default:
+- _dl_reloc_bad_type (map, r_type, 0);
+- break;
+-#endif
+- }
+- }
+-}
+-
+-auto inline void
+-__attribute__ ((always_inline))
+-elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
+- void *const reloc_addr_arg)
+-{
+- Elf64_Addr *const reloc_addr = reloc_addr_arg;
+- *reloc_addr = l_addr + reloc->r_addend;
+-}
+-
+-auto inline void
+-__attribute__ ((always_inline))
+-elf_machine_lazy_rel (struct link_map *map,
+- Elf64_Addr l_addr, const Elf64_Rela *reloc)
+-{
+- switch (ELF64_R_TYPE (reloc->r_info))
+- {
+- case R_SPARC_NONE:
+- break;
+- case R_SPARC_JMP_SLOT:
+- break;
+- default:
+- _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 1);
+- break;
+- }
+-}
+-
+-#endif /* RESOLVE */
+-
+ /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+ PLT entries should not be allowed to define the value.
+ ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+@@ -766,3 +543,231 @@
+ " add %sp, 6*8, %sp\n" \
+ " .size _dl_start_user, . - _dl_start_user\n" \
+ " .previous\n");
++
++#endif /* dl_machine_h */
++
++#ifdef RESOLVE
++
++/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
++ MAP is the object containing the reloc. */
++
++auto inline void
++__attribute__ ((always_inline))
++elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
++ const Elf64_Sym *sym, const struct r_found_version *version,
++ void *const reloc_addr_arg)
++{
++ Elf64_Addr *const reloc_addr = reloc_addr_arg;
++ const unsigned long int r_type = ELF64_R_TYPE_ID (reloc->r_info);
++
++#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
++ if (__builtin_expect (r_type == R_SPARC_RELATIVE, 0))
++ *reloc_addr = map->l_addr + reloc->r_addend;
++# ifndef RTLD_BOOTSTRAP
++ else if (r_type == R_SPARC_NONE) /* Who is Wilbur? */
++ return;
++# endif
++ else
++#endif
++ {
++#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP
++ const Elf64_Sym *const refsym = sym;
++#endif
++ Elf64_Addr value;
++#ifndef RESOLVE_CONFLICT_FIND_MAP
++ if (sym->st_shndx != SHN_UNDEF &&
++ ELF64_ST_BIND (sym->st_info) == STB_LOCAL)
++ value = map->l_addr;
++ else
++ {
++ value = RESOLVE (&sym, version, r_type);
++ if (sym)
++ value += sym->st_value;
++ }
++#else
++ value = 0;
++#endif
++ value += reloc->r_addend; /* Assume copy relocs have zero addend. */
++
++ switch (r_type)
++ {
++#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP
++ case R_SPARC_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
++ || (GLRO(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_arg, (void *) value,
++ MIN (sym->st_size, refsym->st_size));
++ break;
++#endif
++ case R_SPARC_64:
++ case R_SPARC_GLOB_DAT:
++ *reloc_addr = value;
++ break;
++#ifndef RTLD_BOOTSTRAP
++ case R_SPARC_8:
++ *(char *) reloc_addr = value;
++ break;
++ case R_SPARC_16:
++ *(short *) reloc_addr = value;
++ break;
++ case R_SPARC_32:
++ *(unsigned int *) reloc_addr = value;
++ break;
++ case R_SPARC_DISP8:
++ *(char *) reloc_addr = (value - (Elf64_Addr) reloc_addr);
++ break;
++ case R_SPARC_DISP16:
++ *(short *) reloc_addr = (value - (Elf64_Addr) reloc_addr);
++ break;
++ case R_SPARC_DISP32:
++ *(unsigned int *) reloc_addr = (value - (Elf64_Addr) reloc_addr);
++ break;
++ case R_SPARC_WDISP30:
++ *(unsigned int *) reloc_addr =
++ ((*(unsigned int *)reloc_addr & 0xc0000000) |
++ ((value - (Elf64_Addr) reloc_addr) >> 2));
++ break;
++
++ /* MEDLOW code model relocs */
++ case R_SPARC_LO10:
++ *(unsigned int *) reloc_addr =
++ ((*(unsigned int *)reloc_addr & ~0x3ff) |
++ (value & 0x3ff));
++ break;
++ case R_SPARC_HI22:
++ *(unsigned int *) reloc_addr =
++ ((*(unsigned int *)reloc_addr & 0xffc00000) |
++ (value >> 10));
++ break;
++ case R_SPARC_OLO10:
++ *(unsigned int *) reloc_addr =
++ ((*(unsigned int *)reloc_addr & ~0x1fff) |
++ (((value & 0x3ff) + ELF64_R_TYPE_DATA (reloc->r_info)) & 0x1fff));
++ break;
++
++ /* MEDMID code model relocs */
++ case R_SPARC_H44:
++ *(unsigned int *) reloc_addr =
++ ((*(unsigned int *)reloc_addr & 0xffc00000) |
++ (value >> 22));
++ break;
++ case R_SPARC_M44:
++ *(unsigned int *) reloc_addr =
++ ((*(unsigned int *)reloc_addr & ~0x3ff) |
++ ((value >> 12) & 0x3ff));
++ break;
++ case R_SPARC_L44:
++ *(unsigned int *) reloc_addr =
++ ((*(unsigned int *)reloc_addr & ~0xfff) |
++ (value & 0xfff));
++ break;
++
++ /* MEDANY code model relocs */
++ case R_SPARC_HH22:
++ *(unsigned int *) reloc_addr =
++ ((*(unsigned int *)reloc_addr & 0xffc00000) |
++ (value >> 42));
++ break;
++ case R_SPARC_HM10:
++ *(unsigned int *) reloc_addr =
++ ((*(unsigned int *)reloc_addr & ~0x3ff) |
++ ((value >> 32) & 0x3ff));
++ break;
++ case R_SPARC_LM22:
++ *(unsigned int *) reloc_addr =
++ ((*(unsigned int *)reloc_addr & 0xffc00000) |
++ ((value >> 10) & 0x003fffff));
++ break;
++#endif
++ case R_SPARC_JMP_SLOT:
++#ifdef RESOLVE_CONFLICT_FIND_MAP
++ /* R_SPARC_JMP_SLOT conflicts against .plt[32768+]
++ relocs should be turned into R_SPARC_64 relocs
++ in .gnu.conflict section.
++ r_addend non-zero does not mean it is a .plt[32768+]
++ reloc, instead it is the actual address of the function
++ to call. */
++ sparc64_fixup_plt (NULL, reloc, reloc_addr, value, 0, 0);
++#else
++ sparc64_fixup_plt (map, reloc, reloc_addr, value,
++ reloc->r_addend, 0);
++#endif
++ break;
++#ifndef RTLD_BOOTSTRAP
++ case R_SPARC_UA16:
++ ((unsigned char *) reloc_addr_arg) [0] = value >> 8;
++ ((unsigned char *) reloc_addr_arg) [1] = value;
++ break;
++ case R_SPARC_UA32:
++ ((unsigned char *) reloc_addr_arg) [0] = value >> 24;
++ ((unsigned char *) reloc_addr_arg) [1] = value >> 16;
++ ((unsigned char *) reloc_addr_arg) [2] = value >> 8;
++ ((unsigned char *) reloc_addr_arg) [3] = value;
++ break;
++ case R_SPARC_UA64:
++ if (! ((long) reloc_addr_arg & 3))
++ {
++ /* Common in .eh_frame */
++ ((unsigned int *) reloc_addr_arg) [0] = value >> 32;
++ ((unsigned int *) reloc_addr_arg) [1] = value;
++ break;
++ }
++ ((unsigned char *) reloc_addr_arg) [0] = value >> 56;
++ ((unsigned char *) reloc_addr_arg) [1] = value >> 48;
++ ((unsigned char *) reloc_addr_arg) [2] = value >> 40;
++ ((unsigned char *) reloc_addr_arg) [3] = value >> 32;
++ ((unsigned char *) reloc_addr_arg) [4] = value >> 24;
++ ((unsigned char *) reloc_addr_arg) [5] = value >> 16;
++ ((unsigned char *) reloc_addr_arg) [6] = value >> 8;
++ ((unsigned char *) reloc_addr_arg) [7] = value;
++ break;
++#endif
++#if !defined RTLD_BOOTSTRAP || defined _NDEBUG
++ default:
++ _dl_reloc_bad_type (map, r_type, 0);
++ break;
++#endif
++ }
++ }
++}
++
++auto inline void
++__attribute__ ((always_inline))
++elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
++ void *const reloc_addr_arg)
++{
++ Elf64_Addr *const reloc_addr = reloc_addr_arg;
++ *reloc_addr = l_addr + reloc->r_addend;
++}
++
++auto inline void
++__attribute__ ((always_inline))
++elf_machine_lazy_rel (struct link_map *map,
++ Elf64_Addr l_addr, const Elf64_Rela *reloc)
++{
++ switch (ELF64_R_TYPE (reloc->r_info))
++ {
++ case R_SPARC_NONE:
++ break;
++ case R_SPARC_JMP_SLOT:
++ break;
++ default:
++ _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 1);
++ break;
++ }
++}
++
++#endif /* RESOLVE */
================================================================
---- CVS-web:
http://cvs.pld-linux.org/SOURCES/glibc-sparc64-dl-machine.patch?r1=1.1&r2=1.2&f=u
More information about the pld-cvs-commit
mailing list