This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: powerpc new PLT and GOT


It turns out that it's useful to have the value of _GLOBAL_OFFSET_TABLE_
available easily in ld.so, and since ld.so doesn't need a pointer to
.glink I've renamed the tag that indicates a new PLT/GOT accordingly.

include/elf/
	* ppc.h (DT_PPC_GOT): Rename from DT_PPC_GLINK.
bfd/
	* elf32-ppc.c (ppc_elf_size_dynamic_sections): Set DT_PPC_GOT,
	not DT_PPC_GLINK.
	(ppc_elf_finish_dynamic_sections): Likewise.
binutils/
	* readelf.c (get_ppc_dynamic_type): Display DT_PPC_GOT, not
	DT_PPC_GLINK.

Index: include/elf/ppc.h
===================================================================
RCS file: /cvs/src/src/include/elf/ppc.h,v
retrieving revision 1.17
diff -u -p -r1.17 ppc.h
--- include/elf/ppc.h	11 May 2005 14:08:45 -0000	1.17
+++ include/elf/ppc.h	14 May 2005 04:28:53 -0000
@@ -145,8 +145,8 @@ END_RELOC_NUMBERS (R_PPC_max)
 #define IS_PPC_TLS_RELOC(R) \
   ((R) >= R_PPC_TLS && (R) <= R_PPC_GOT_DTPREL16_HA)
 
-/* Specify the start of the .glink section.  */
-#define DT_PPC_GLINK		DT_LOPROC
+/* Specify the value of _GLOBAL_OFFSET_TABLE_.  */
+#define DT_PPC_GOT		DT_LOPROC
 
 /* Processor specific flags for the ELF header e_flags field.  */
 
Index: bfd/elf32-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-ppc.c,v
retrieving revision 1.157
diff -u -p -r1.157 elf32-ppc.c
--- bfd/elf32-ppc.c	12 May 2005 15:24:51 -0000	1.157
+++ bfd/elf32-ppc.c	14 May 2005 04:28:57 -0000
@@ -4406,7 +4406,7 @@ ppc_elf_size_dynamic_sections (bfd *outp
 
       if (htab->glink != NULL && htab->glink->size != 0)
 	{
-	  if (!add_dynamic_entry (DT_PPC_GLINK, 0))
+	  if (!add_dynamic_entry (DT_PPC_GOT, 0))
 	    return FALSE;
 	}
 
@@ -6313,6 +6313,7 @@ ppc_elf_finish_dynamic_sections (bfd *ou
 {
   asection *sdyn;
   struct ppc_elf_link_hash_table *htab;
+  bfd_vma got;
 
 #ifdef DEBUG
   fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n");
@@ -6321,6 +6322,12 @@ ppc_elf_finish_dynamic_sections (bfd *ou
   htab = ppc_elf_hash_table (info);
   sdyn = bfd_get_section_by_name (htab->elf.dynobj, ".dynamic");
 
+  got = 0;
+  if (htab->elf.hgot != NULL)
+    got = (htab->elf.hgot->root.u.def.value
+	   + htab->elf.hgot->root.u.def.section->output_section->vma
+	   + htab->elf.hgot->root.u.def.section->output_offset);
+
   if (htab->elf.dynamic_sections_created)
     {
       Elf32_External_Dyn *dyncon, *dynconend;
@@ -6352,10 +6359,8 @@ ppc_elf_finish_dynamic_sections (bfd *ou
 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
 	      break;
 
-	    case DT_PPC_GLINK:
-	      s = htab->glink;
-	      dyn.d_un.d_ptr = (s->size - GLINK_PLTRESOLVE
-				+ s->output_section->vma + s->output_offset);
+	    case DT_PPC_GOT:
+	      dyn.d_un.d_ptr = got;
 	      break;
 
 	    default:
@@ -6389,7 +6394,7 @@ ppc_elf_finish_dynamic_sections (bfd *ou
     {
       unsigned char *p;
       unsigned char *endp;
-      bfd_vma got, pltgot;
+      bfd_vma pltgot;
       unsigned int i;
       static const unsigned int plt_resolve[] =
 	{
@@ -6409,10 +6414,6 @@ ppc_elf_finish_dynamic_sections (bfd *ou
 #define PPC_HI(v) (((v) >> 16) & 0xffff)
 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
 
-      got = (htab->elf.hgot->root.u.def.value
-	     + htab->elf.hgot->root.u.def.section->output_section->vma
-	     + htab->elf.hgot->root.u.def.section->output_offset);
-
       pltgot = (htab->plt->output_section->vma
 		+ htab->plt->output_offset
 		- got);
Index: binutils/readelf.c
===================================================================
RCS file: /cvs/src/src/binutils/readelf.c,v
retrieving revision 1.293
diff -u -p -r1.293 readelf.c
--- binutils/readelf.c	14 May 2005 01:38:14 -0000	1.293
+++ binutils/readelf.c	14 May 2005 04:29:06 -0000
@@ -1417,7 +1417,7 @@ get_ppc_dynamic_type (unsigned long type
 {
   switch (type)
     {
-    case DT_PPC_GLINK: return "PPC_GLINK";
+    case DT_PPC_GOT: return "PPC_GOT";
     default:
       return NULL;
     }

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]