public inbox for prelink@sourceware.org
 help / color / mirror / Atom feed
From: "Joseph S. Myers" <joseph@codesourcery.com>
To: prelink@sourceware.org
Subject: [ARM prelink 1/3] Use endian-neutral functions
Date: Wed, 04 Mar 2009 01:43:00 -0000	[thread overview]
Message-ID: <Pine.LNX.4.64.0903040142590.15240@digraph.polyomino.org.uk> (raw)

This is the first of three patches with various fixes to the
prelinker's ARM support.  This one is purely mechanical and makes the
ARM code use endian-neutral functions, since ARM can have either
endianness.  Please commit if OK.

2009-03-04  Daniel Jacobowitz  <dan@codesourcery.com>

	* src/arch-arm.c (arm_adjust_dyn, arm_adjust_rel, arm_adjust_rela,
	arm_prelink_rel, arm_prelink_rela, arm_apply_conflict_rela,
	arm_apply_rel, arm_apply_rela, arm_prelink_conflict_rela,
	arm_rel_to_rela, arm_rela_to_rel, arm_need_rel_to_rela,
	arm_arch_prelink, arm_arch_undo_prelink, arm_undo_prelink_rel):
	Use endian-neutral functions.

diff -rupN prelink.orig/src/arch-arm.c prelink.ne32/src/arch-arm.c
--- prelink.orig/src/arch-arm.c	2009-03-03 17:05:14.000000000 -0800
+++ prelink.ne32/src/arch-arm.c	2009-03-03 17:15:05.000000000 -0800
@@ -40,12 +40,12 @@ arm_adjust_dyn (DSO *dso, int n, GElf_Dy
       if (sec == -1)
 	return 0;
 
-      data = read_ule32 (dso, dyn->d_un.d_ptr);
+      data = read_une32 (dso, dyn->d_un.d_ptr);
       /* If .got.plt[0] points to _DYNAMIC, it needs to be adjusted.  */
       if (data == dso->shdr[n].sh_addr && data >= start)
-	write_le32 (dso, dyn->d_un.d_ptr, data + adjust);
+	write_ne32 (dso, dyn->d_un.d_ptr, data + adjust);
 
-      data = read_ule32 (dso, dyn->d_un.d_ptr + 4);
+      data = read_une32 (dso, dyn->d_un.d_ptr + 4);
       /* If .got.plt[1] points to .plt, it needs to be adjusted.  */
       if (data && data >= start)
 	{
@@ -57,7 +57,7 @@ arm_adjust_dyn (DSO *dso, int n, GElf_Dy
 		&& strcmp (strptr (dso, dso->ehdr.e_shstrndx,
 				   dso->shdr[i].sh_name), ".plt") == 0)
 	      {
-		write_le32 (dso, dyn->d_un.d_ptr + 4, data + adjust);
+		write_ne32 (dso, dyn->d_un.d_ptr + 4, data + adjust);
 		break;
 	      }
 	}
@@ -74,9 +74,9 @@ arm_adjust_rel (DSO *dso, GElf_Rel *rel,
     {
     case R_ARM_RELATIVE:
     case R_ARM_JUMP_SLOT:
-      data = read_ule32 (dso, rel->r_offset);
+      data = read_une32 (dso, rel->r_offset);
       if (data >= start)
-	write_le32 (dso, rel->r_offset, data + adjust);
+	write_ne32 (dso, rel->r_offset, data + adjust);
       break;
     }
   return 0;
@@ -96,13 +96,13 @@ arm_adjust_rela (DSO *dso, GElf_Rela *re
 	  rela->r_addend += (Elf32_Sword) adjust;
 	  /* Write it to the memory location as well.
 	     Not necessary, but we can do it.  */
-	  write_le32 (dso, rela->r_offset, rela->r_addend);
+	  write_ne32 (dso, rela->r_offset, rela->r_addend);
 	}
       break;
     case R_ARM_JUMP_SLOT:
-      data = read_ule32 (dso, rela->r_offset);
+      data = read_une32 (dso, rela->r_offset);
       if (data >= start)
-	write_le32 (dso, rela->r_offset, data + adjust);
+	write_ne32 (dso, rela->r_offset, data + adjust);
       break;
       break;
     }
@@ -126,18 +126,18 @@ arm_prelink_rel (struct prelink_info *in
     {
     case R_ARM_GLOB_DAT:
     case R_ARM_JUMP_SLOT:
-      write_le32 (dso, rel->r_offset, value);
+      write_ne32 (dso, rel->r_offset, value);
       break;
     case R_ARM_ABS32:
       {
-	if (read_ule32 (dso, rel->r_offset))
+	if (read_une32 (dso, rel->r_offset))
 	  {
 	    error (0, 0, "%s: R_ARM_ABS32 relocs with non-zero addend should not be present in prelinked REL sections",
 		   dso->filename);
 	    return 1;
 	  }
 	rel->r_info = GELF_R_INFO (GELF_R_SYM (rel->r_info), R_ARM_GLOB_DAT);
-	write_le32 (dso, rel->r_offset, value);
+	write_ne32 (dso, rel->r_offset, value);
 	/* Tell prelink_rel routine *rel has changed.  */
 	return 2;
       }
@@ -178,10 +178,10 @@ arm_prelink_rela (struct prelink_info *i
     {
     case R_ARM_GLOB_DAT:
     case R_ARM_JUMP_SLOT:
-      write_le32 (dso, rela->r_offset, value + rela->r_addend);
+      write_ne32 (dso, rela->r_offset, value + rela->r_addend);
       break;
     case R_ARM_ABS32:
-      write_le32 (dso, rela->r_offset, value + rela->r_addend);
+      write_ne32 (dso, rela->r_offset, value + rela->r_addend);
       break;
     case R_ARM_PC24:
       val = value + rela->r_addend - rela->r_offset;
@@ -192,8 +192,8 @@ arm_prelink_rela (struct prelink_info *i
 	  return 1;
 	}
       val &= 0xffffff;
-      write_le32 (dso, rela->r_offset,
-		  (read_ule32 (dso, rela->r_offset) & 0xff000000) | val);
+      write_ne32 (dso, rela->r_offset,
+		  (read_une32 (dso, rela->r_offset) & 0xff000000) | val);
       break;
     case R_ARM_COPY:
       if (dso->ehdr.e_type == ET_EXEC)
@@ -218,7 +218,7 @@ arm_apply_conflict_rela (struct prelink_
     case R_ARM_GLOB_DAT:
     case R_ARM_JUMP_SLOT:
     case R_ARM_ABS32:
-      buf_write_le32 (buf, rela->r_addend);
+      buf_write_ne32 (info->dso, buf, rela->r_addend);
       break;
     default:
       abort ();
@@ -240,14 +240,14 @@ arm_apply_rel (struct prelink_info *info
       break;
     case R_ARM_GLOB_DAT:
     case R_ARM_JUMP_SLOT:
-      buf_write_le32 (buf, value);
+      buf_write_ne32 (info->dso, buf, value);
       break;
     case R_ARM_ABS32:
-      buf_write_le32 (buf, value + read_ule32 (info->dso, rel->r_offset));
+      buf_write_ne32 (info->dso, buf, value + read_une32 (info->dso, rel->r_offset));
       break;
     case R_ARM_PC24:
       val = value + rel->r_offset;
-      value = read_ule32 (info->dso, rel->r_offset) << 8;
+      value = read_une32 (info->dso, rel->r_offset) << 8;
       value = ((Elf32_Sword) value) >> 6;
       val += value;
       val >>= 2;
@@ -257,7 +257,7 @@ arm_apply_rel (struct prelink_info *info
 	  return 1;
 	}
       val &= 0xffffff;
-      buf_write_le32 (buf, (buf_read_ule32 (buf) & 0xff000000) | val);
+      buf_write_ne32 (info->dso, buf, (buf_read_une32 (info->dso, buf) & 0xff000000) | val);
       break;
     case R_ARM_COPY:
       abort ();
@@ -285,7 +285,7 @@ arm_apply_rela (struct prelink_info *inf
     case R_ARM_GLOB_DAT:
     case R_ARM_JUMP_SLOT:
     case R_ARM_ABS32:
-      buf_write_le32 (buf, value + rela->r_addend);
+      buf_write_ne32 (info->dso, buf, value + rela->r_addend);
       break;
     case R_ARM_PC24:
       val = value + rela->r_addend - rela->r_offset;
@@ -296,7 +296,7 @@ arm_apply_rela (struct prelink_info *inf
 	  return 1;
 	}
       val &= 0xffffff;
-      buf_write_le32 (buf, (buf_read_ule32 (buf) & 0xff000000) | val);
+      buf_write_ne32 (info->dso, buf, (buf_read_une32 (info->dso, buf) & 0xff000000) | val);
       break;
     case R_ARM_COPY:
       abort ();
@@ -391,7 +391,7 @@ arm_prelink_conflict_rela (DSO *dso, str
 	  error (0, 0, "%s: R_ARM_PC24 overflow", dso->filename);
 	  return 1;
 	}
-      value = read_ule32 (dso, rela->r_offset) & 0xff000000;
+      value = read_une32 (dso, rela->r_offset) & 0xff000000;
       ret->r_addend = (Elf32_Sword) (value | (val & 0xffffff));
       ret->r_info = GELF_R_INFO (0, R_ARM_ABS32);
       break;
@@ -418,10 +418,10 @@ arm_rel_to_rela (DSO *dso, GElf_Rel *rel
       abort ();
     case R_ARM_RELATIVE:
     case R_ARM_ABS32:
-      rela->r_addend = (Elf32_Sword) read_ule32 (dso, rel->r_offset);
+      rela->r_addend = (Elf32_Sword) read_une32 (dso, rel->r_offset);
       break;
     case R_ARM_PC24:
-      rela->r_addend = read_ule32 (dso, rel->r_offset) << 8;
+      rela->r_addend = read_une32 (dso, rel->r_offset) << 8;
       rela->r_addend = ((Elf32_Sword) rela->r_addend) >> 6;
       break;
     case R_ARM_COPY:
@@ -445,15 +445,15 @@ arm_rela_to_rel (DSO *dso, GElf_Rela *re
       abort ();
     case R_ARM_RELATIVE:
     case R_ARM_ABS32:
-      write_le32 (dso, rela->r_offset, rela->r_addend);
+      write_ne32 (dso, rela->r_offset, rela->r_addend);
       break;
     case R_ARM_PC24:
-      write_le32 (dso, rela->r_offset,
-		  (read_ule32 (dso, rela->r_offset) & 0xff000000)
+      write_ne32 (dso, rela->r_offset,
+		  (read_une32 (dso, rela->r_offset) & 0xff000000)
 		  | ((rela->r_addend >> 2) & 0xffffff));
       break;
     case R_ARM_GLOB_DAT:
-      write_le32 (dso, rela->r_offset, 0);
+      write_ne32 (dso, rela->r_offset, 0);
       break;
     }
   return 0;
@@ -479,7 +479,7 @@ arm_need_rel_to_rela (DSO *dso, int firs
 	    switch (ELF32_R_TYPE (rel->r_info))
 	      {
 	      case R_ARM_ABS32:
-		val = read_ule32 (dso, rel->r_offset);
+		val = read_une32 (dso, rel->r_offset);
 		/* R_ARM_ABS32 with addend 0 can be converted
 		   to R_ARM_GLOB_DAT and we don't have to convert
 		   to RELA because of that.  */
@@ -521,7 +521,7 @@ arm_arch_prelink (struct prelink_info *i
       if (i == dso->ehdr.e_shnum)
 	return 0;
       data = dso->shdr[i].sh_addr;
-      write_le32 (dso, dso->info[DT_PLTGOT] + 4, data);
+      write_ne32 (dso, dso->info[DT_PLTGOT] + 4, data);
     }
 
   return 0;
@@ -550,9 +550,9 @@ arm_arch_undo_prelink (DSO *dso)
 
       if (i == dso->ehdr.e_shnum)
 	return 0;
-      data = read_ule32 (dso, dso->info[DT_PLTGOT] + 4);
+      data = read_une32 (dso, dso->info[DT_PLTGOT] + 4);
       if (data == dso->shdr[i].sh_addr)
-	write_le32 (dso, dso->info[DT_PLTGOT] + 4, 0);
+	write_ne32 (dso, dso->info[DT_PLTGOT] + 4, 0);
     }
 
   return 0;
@@ -580,17 +580,17 @@ arm_undo_prelink_rel (DSO *dso, GElf_Rel
 	}
       else
 	{
-	  Elf32_Addr data = read_ule32 (dso, dso->shdr[sec].sh_addr + 4);
+	  Elf32_Addr data = read_une32 (dso, dso->shdr[sec].sh_addr + 4);
 
 	  assert (rel->r_offset >= dso->shdr[sec].sh_addr + 12);
 	  assert (((rel->r_offset - dso->shdr[sec].sh_addr) & 3) == 0);
-	  write_le32 (dso, rel->r_offset, data);
+	  write_ne32 (dso, rel->r_offset, data);
 	}
       break;
     case R_ARM_GLOB_DAT:
       sec = addr_to_sec (dso, rel->r_offset);
 
-      write_le32 (dso, rel->r_offset, 0);
+      write_ne32 (dso, rel->r_offset, 0);
       if (sec != -1)
 	{
 	  if (strcmp (strptr (dso, dso->ehdr.e_shstrndx,

-- 
Joseph S. Myers
joseph@codesourcery.com

                 reply	other threads:[~2009-03-04  1:43 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Pine.LNX.4.64.0903040142590.15240@digraph.polyomino.org.uk \
    --to=joseph@codesourcery.com \
    --cc=prelink@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).