Fix more EINTR handling problems.  Add jump prediction.
diff --git a/lib/ChangeLog b/lib/ChangeLog
index 5b79d09..f7760f1 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,7 @@
+2005-08-28  Ulrich Drepper  <drepper@redhat.com>
+
+	* system.h: Define pwrite_retry, write_retry, and pread_retry.
+
 2005-08-06  Ulrich Drepper  <drepper@redhat.com>
 
 	* Makefile.am (xmalloc_CFLAGS): Define only if !GPROF.
diff --git a/lib/system.h b/lib/system.h
index e29c2db..998bf72 100644
--- a/lib/system.h
+++ b/lib/system.h
@@ -37,4 +37,12 @@
 
 #define gettext_noop(Str) Str
 
+
+#define pwrite_retry(fd, buf,  len, off) \
+  TEMP_FAILURE_RETRY (pwrite (fd, buf, len, off))
+#define write_retry(fd, buf, n) \
+     TEMP_FAILURE_RETRY (write (fd, buf, n))
+#define pread_retry(fd, buf,  len, off) \
+  TEMP_FAILURE_RETRY (pread (fd, buf, len, off))
+
 #endif /* system.h */
diff --git a/libelf/ChangeLog b/libelf/ChangeLog
index 4146968..bd710ae 100644
--- a/libelf/ChangeLog
+++ b/libelf/ChangeLog
@@ -1,5 +1,16 @@
 2005-08-28  Ulrich Drepper  <drepper@redhat.com>
 
+	* elf32_getphdr.c: Include <system.h>.  Use pread_retry instead of
+	pread.  And branch prediction where useful.
+	* elf_begin.c: Likewise.
+	* elf_getdata.c: Likewise.
+	* elf_getshstrndx.c: Likewise.
+	* elf_readall.c: Likewise.
+	* gelf_rawchunk.c: Likewise.
+	* elf32_updatefile.c: Include <system.h>.  Use pread_retry instead of
+	pread.  And branch prediction where useful.
+	* elf_getarsym.c: Don't define pread_retry here.
+
 	* Makefile.am: Use $(LINK) not $(CC) when creating DSO.
 	(%.os): Use COMPILE.os.
 	(COMPILE.os): Filter out gconv options.
diff --git a/libelf/elf32_getphdr.c b/libelf/elf32_getphdr.c
index 2569368..341acf0 100644
--- a/libelf/elf32_getphdr.c
+++ b/libelf/elf32_getphdr.c
@@ -19,9 +19,11 @@
 # include <config.h>
 #endif
 
+#include <errno.h>
 #include <stdlib.h>
 #include <unistd.h>
 
+#include <system.h>
 #include "libelfP.h"
 #include "common.h"
 
@@ -148,9 +150,10 @@
 	  elf->state.ELFW(elf,LIBELFBITS).phdr_flags |= ELF_F_MALLOCED;
 
 	  /* Read the header.  */
-	  if ((size_t) pread (elf->fildes,
-			      elf->state.ELFW(elf,LIBELFBITS).phdr, size,
-			      (elf->start_offset + ehdr->e_phoff)) != size)
+	  ssize_t n = pread_retry (elf->fildes,
+				   elf->state.ELFW(elf,LIBELFBITS).phdr, size,
+				   elf->start_offset + ehdr->e_phoff);
+	  if (unlikely ((size_t) n != size))
 	    {
 	      /* Severe problems.  We cannot read the data.  */
 	      __libelf_seterrno (ELF_E_READ_ERROR);
diff --git a/libelf/elf32_getshdr.c b/libelf/elf32_getshdr.c
index 1e26e85..cf7a41f 100644
--- a/libelf/elf32_getshdr.c
+++ b/libelf/elf32_getshdr.c
@@ -20,8 +20,10 @@
 #endif
 
 #include <assert.h>
+#include <errno.h>
 #include <unistd.h>
 
+#include <system.h>
 #include "libelfP.h"
 #include "common.h"
 
@@ -122,12 +124,13 @@
 	      CONVERT_TO (shdr[cnt].sh_entsize, notcvt[cnt].sh_entsize);
 	    }
 	}
-      else if (elf->fildes != -1)
+      else if (likely (elf->fildes != -1))
 	{
 	  /* Read the header.  */
-	  if ((size_t) pread (elf->fildes,
-			      elf->state.ELFW(elf,LIBELFBITS).shdr, size,
-			      elf->start_offset + ehdr->e_shoff) != size)
+	  ssize_t n = pread_retry (elf->fildes,
+				   elf->state.ELFW(elf,LIBELFBITS).shdr, size,
+				   elf->start_offset + ehdr->e_shoff);
+	  if (unlikely ((size_t) n != size))
 	    {
 	      /* Severe problems.  We cannot read the data.  */
 	      __libelf_seterrno (ELF_E_READ_ERROR);
diff --git a/libelf/elf32_updatefile.c b/libelf/elf32_updatefile.c
index 14893de..260fb34 100644
--- a/libelf/elf32_updatefile.c
+++ b/libelf/elf32_updatefile.c
@@ -20,6 +20,7 @@
 #endif
 
 #include <assert.h>
+#include <errno.h>
 #include <libelf.h>
 #include <stdbool.h>
 #include <stdlib.h>
@@ -27,6 +28,7 @@
 #include <unistd.h>
 #include <sys/param.h>
 
+#include <system.h>
 #include "libelfP.h"
 
 
@@ -326,7 +328,7 @@
       /* This many bytes we want to write in this round.  */
       size_t n = MIN (filled, len);
 
-      if (unlikely ((size_t) pwrite (fd, fillbuf, n, pos) != n))
+      if (unlikely ((size_t) pwrite_retry (fd, fillbuf, n, pos) != n))
 	{
 	  __libelf_seterrno (ELF_E_WRITE_ERROR);
 	  return 1;
@@ -381,8 +383,8 @@
 	}
 
       /* Write out the ELF header.  */
-      if (unlikely (pwrite (elf->fildes, out_ehdr,
-			    sizeof (ElfW2(LIBELFBITS,Ehdr)), 0)
+      if (unlikely (pwrite_retry (elf->fildes, out_ehdr,
+				  sizeof (ElfW2(LIBELFBITS,Ehdr)), 0)
 		    != sizeof (ElfW2(LIBELFBITS,Ehdr))))
 	{
 	  __libelf_seterrno (ELF_E_WRITE_ERROR);
@@ -441,10 +443,10 @@
 	}
 
       /* Write out the ELF header.  */
-      if (unlikely ((size_t) pwrite (elf->fildes, out_phdr,
-				     sizeof (ElfW2(LIBELFBITS,Phdr))
-				     * ehdr->e_phnum, ehdr->e_phoff)
-		    != sizeof (ElfW2(LIBELFBITS,Phdr)) * ehdr->e_phnum))
+      size_t phdr_size = sizeof (ElfW2(LIBELFBITS,Phdr)) * ehdr->e_phnum;
+      if (unlikely ((size_t) pwrite_retry (elf->fildes, out_phdr,
+					   phdr_size, ehdr->e_phoff)
+		    != phdr_size))
 	{
 	  __libelf_seterrno (ELF_E_WRITE_ERROR);
 	  return 1;
@@ -544,10 +546,10 @@
 			(*fctp) (buf, dl->data.d.d_buf, dl->data.d.d_size, 1);
 		      }
 
-		    if (unlikely ((size_t) pwrite (elf->fildes, buf,
-						   dl->data.d.d_size,
-						   last_offset)
-				  != dl->data.d.d_size))
+		    ssize_t n = pwrite_retry (elf->fildes, buf,
+					      dl->data.d.d_size,
+					      last_offset);
+		    if (unlikely ((size_t) n != dl->data.d.d_size))
 		      {
 			if (buf != dl->data.d.d_buf && buf != tmpbuf)
 			  free (buf);
@@ -593,9 +595,9 @@
 
       /* Write out the section header table.  */
       if (shdr_flags & ELF_F_DIRTY
-	  && unlikely ((size_t) pwrite (elf->fildes, shdr_data,
-					sizeof (ElfW2(LIBELFBITS,Shdr))
-					* shnum, shdr_offset)
+	  && unlikely ((size_t) pwrite_retry (elf->fildes, shdr_data,
+					      sizeof (ElfW2(LIBELFBITS,Shdr))
+					      * shnum, shdr_offset)
 		       != sizeof (ElfW2(LIBELFBITS,Shdr)) * shnum))
 	{
 	  __libelf_seterrno (ELF_E_WRITE_ERROR);
diff --git a/libelf/elf_begin.c b/libelf/elf_begin.c
index c797986..c21a52b 100644
--- a/libelf/elf_begin.c
+++ b/libelf/elf_begin.c
@@ -31,6 +31,7 @@
 #include <sys/param.h>
 #include <sys/stat.h>
 
+#include <system.h>
 #include "libelfP.h"
 #include "common.h"
 
@@ -144,12 +145,10 @@
 						 + offset))->sh_size,
 			sizeof (Elf32_Word));
 	      else
-		if (TEMP_FAILURE_RETRY (pread (fildes, &size,
-					       sizeof (Elf32_Word),
-					       offset + ehdr.e32->e_shoff
-					       + offsetof (Elf32_Shdr,
-							   sh_size)))
-		    != sizeof (Elf32_Word))
+		if (unlikely (pread_retry (fildes, &size, sizeof (Elf32_Word),
+					   offset + ehdr.e32->e_shoff
+					   + offsetof (Elf32_Shdr, sh_size))
+			      != sizeof (Elf32_Word)))
 		  return (size_t) -1l;
 
 	      if (e_ident[EI_DATA] != MY_ELFDATA)
@@ -188,12 +187,10 @@
 						 + offset))->sh_size,
 			sizeof (Elf64_Xword));
 	      else
-		if (TEMP_FAILURE_RETRY (pread (fildes, &size,
-					       sizeof (Elf64_Word),
-					       offset + ehdr.e64->e_shoff
-					       + offsetof (Elf64_Shdr,
-							   sh_size)))
-		    != sizeof (Elf64_Xword))
+		if (unlikely (pread_retry (fildes, &size, sizeof (Elf64_Word),
+					   offset + ehdr.e64->e_shoff
+					   + offsetof (Elf64_Shdr, sh_size))
+			      != sizeof (Elf64_Xword)))
 		  return (size_t) -1l;
 
 	      if (e_ident[EI_DATA] != MY_ELFDATA)
@@ -459,11 +456,11 @@
   } mem;
 
   /* Read the head of the file.  */
-  ssize_t nread = pread (fildes, mem.header, MIN (MAX (sizeof (Elf64_Ehdr),
-						       SARMAG),
-						  maxsize),
-			 offset);
-  if (nread == -1)
+  ssize_t nread = pread_retry (fildes, mem.header,
+			       MIN (MAX (sizeof (Elf64_Ehdr), SARMAG),
+				    maxsize),
+			       offset);
+  if (unlikely (nread == -1))
     /* We cannot even read the head of the file.  Maybe FILDES is associated
        with an unseekable device.  This is nothing we can handle.  */
     return NULL;
@@ -597,8 +594,9 @@
       else
 	{
 	  /* Read the header from the file.  */
-	  if (pread (elf->fildes, &hdrm, sizeof (hdrm),
-		     elf->start_offset + offset) != sizeof (hdrm))
+	  if (unlikely (pread_retry (elf->fildes, &hdrm, sizeof (hdrm),
+				     elf->start_offset + offset)
+			!= sizeof (hdrm)))
 	    return NULL;
 
 	  hdr = &hdrm;
@@ -628,10 +626,10 @@
 						    len);
       else
 	{
-	  if ((size_t) pread (elf->fildes, newp, len,
-			      elf->start_offset + offset
-			      + sizeof (struct ar_hdr))
-	      != len)
+	  if (unlikely ((size_t) pread_retry (elf->fildes, newp, len,
+					      elf->start_offset + offset
+					      + sizeof (struct ar_hdr))
+			!= len))
 	    {
 	      /* We were not able to read all data.  */
 	      free (newp);
@@ -681,8 +679,8 @@
   if (elf->map_address != NULL)
     {
       /* See whether this entry is in the file.  */
-      if (elf->state.ar.offset + sizeof (struct ar_hdr)
-	  > elf->start_offset + elf->maximum_size)
+      if (unlikely (elf->state.ar.offset + sizeof (struct ar_hdr)
+		    > elf->start_offset + elf->maximum_size))
 	{
 	  /* This record is not anymore in the file.  */
 	  __libelf_seterrno (ELF_E_RANGE);
@@ -694,10 +692,9 @@
     {
       ar_hdr = &elf->state.ar.ar_hdr;
 
-      if (TEMP_FAILURE_RETRY (pread (elf->fildes, ar_hdr,
-				     sizeof (struct ar_hdr),
-				     elf->state.ar.offset))
-	  != sizeof (struct ar_hdr))
+      if (unlikely (pread_retry (elf->fildes, ar_hdr, sizeof (struct ar_hdr),
+				 elf->state.ar.offset)
+		    != sizeof (struct ar_hdr)))
 	{
 	  /* Something went wrong while reading the file.  */
 	  __libelf_seterrno (ELF_E_RANGE);
@@ -706,7 +703,7 @@
     }
 
   /* One little consistency check.  */
-  if (memcmp (ar_hdr->ar_fmag, ARFMAG, 2) != 0)
+  if (unlikely (memcmp (ar_hdr->ar_fmag, ARFMAG, 2) != 0))
     {
       /* This is no valid archive.  */
       __libelf_seterrno (ELF_E_ARCHIVE_FMAG);
@@ -730,14 +727,14 @@
 	       && memcmp (ar_hdr->ar_name, "//              ", 16) == 0)
 	/* This is the array with the long names.  */
 	elf_ar_hdr->ar_name = memcpy (elf->state.ar.ar_name, "//", 3);
-      else if (isdigit (ar_hdr->ar_name[1]))
+      else if (likely  (isdigit (ar_hdr->ar_name[1])))
 	{
 	  size_t offset;
 
 	  /* This is a long name.  First we have to read the long name
 	     table, if this hasn't happened already.  */
-	  if (elf->state.ar.long_names == NULL
-	      && read_long_names (elf) == NULL)
+	  if (unlikely (elf->state.ar.long_names == NULL
+			&& read_long_names (elf) == NULL))
 	    {
 	      /* No long name table although it is reference.  The archive is
 		 broken.  */
@@ -746,7 +743,7 @@
 	    }
 
 	  offset = atol (ar_hdr->ar_name + 1);
-	  if (offset >= elf->state.ar.long_names_len)
+	  if (unlikely (offset >= elf->state.ar.long_names_len))
 	    {
 	      /* The index in the long name table is larger than the table.  */
 	      __libelf_seterrno (ELF_E_INVALID_ARCHIVE);
@@ -860,7 +857,7 @@
 
   if (ar_hdr->ar_size[sizeof (ar_hdr->ar_size) - 1] == ' ')
     {
-      if (ar_hdr->ar_size[0] == ' ')
+      if (unlikely (ar_hdr->ar_size[0] == ' '))
 	/* Something is really wrong.  We cannot live without a size for
 	   the member since it will not be possible to find the next
 	   archive member.  */
@@ -900,7 +897,7 @@
     fildes = ref->fildes;
   /* The file descriptor better should be the same.  If it was disconnected
      already (using `elf_cntl') we do not test it.  */
-  else if (ref->fildes != -1 && fildes != ref->fildes)
+  else if (unlikely (ref->fildes != -1 && fildes != ref->fildes))
     {
       __libelf_seterrno (ELF_E_FD_MISMATCH);
       return NULL;
@@ -909,10 +906,10 @@
   /* The mode must allow reading.  I.e., a descriptor creating with a
      command different then ELF_C_READ, ELF_C_WRITE and ELF_C_RDWR is
      not allowed.  */
-  if (ref->cmd != ELF_C_READ && ref->cmd != ELF_C_READ_MMAP
-      && ref->cmd != ELF_C_WRITE && ref->cmd != ELF_C_WRITE_MMAP
-      && ref->cmd != ELF_C_RDWR && ref->cmd != ELF_C_RDWR_MMAP
-      && ref->cmd != ELF_C_READ_MMAP_PRIVATE)
+  if (unlikely (ref->cmd != ELF_C_READ && ref->cmd != ELF_C_READ_MMAP
+		&& ref->cmd != ELF_C_WRITE && ref->cmd != ELF_C_WRITE_MMAP
+		&& ref->cmd != ELF_C_RDWR && ref->cmd != ELF_C_RDWR_MMAP
+		&& ref->cmd != ELF_C_READ_MMAP_PRIVATE))
     {
       __libelf_seterrno (ELF_E_INVALID_OP);
       return NULL;
@@ -989,7 +986,7 @@
 {
   Elf *retval;
 
-  if (! __libelf_version_initialized)
+  if (unlikely (! __libelf_version_initialized))
     {
       /* Version wasn't set so far.  */
       __libelf_seterrno (ELF_E_NO_VERSION);
@@ -999,7 +996,7 @@
   if (ref != NULL)
     /* Make sure the descriptor is not suddenly going away.  */
     rwlock_rdlock (ref->lock);
-  else if (fcntl (fildes, F_GETFL) == -1 && errno == EBADF)
+  else if (unlikely (fcntl (fildes, F_GETFL) == -1 && errno == EBADF))
     {
       /* We cannot do anything productive without a file descriptor.  */
       __libelf_seterrno (ELF_E_INVALID_FILE);
@@ -1015,7 +1012,7 @@
 
     case ELF_C_READ_MMAP_PRIVATE:
       /* If we have a reference it must also be opened this way.  */
-      if (ref != NULL && ref->cmd != ELF_C_READ_MMAP_PRIVATE)
+      if (unlikely (ref != NULL && ref->cmd != ELF_C_READ_MMAP_PRIVATE))
 	{
 	  __libelf_seterrno (ELF_E_INVALID_CMD);
 	  retval = NULL;
@@ -1039,8 +1036,9 @@
 	 command.  */
       if (ref != NULL)
 	{
-	  if (ref->cmd != ELF_C_RDWR && ref->cmd != ELF_C_RDWR_MMAP
-	      && ref->cmd != ELF_C_WRITE && ref->cmd != ELF_C_WRITE_MMAP)
+	  if (unlikely (ref->cmd != ELF_C_RDWR && ref->cmd != ELF_C_RDWR_MMAP
+			&& ref->cmd != ELF_C_WRITE
+			&& ref->cmd != ELF_C_WRITE_MMAP))
 	    {
 	      /* This is not ok.  REF must also be opened for writing.  */
 	      __libelf_seterrno (ELF_E_INVALID_CMD);
diff --git a/libelf/elf_getarsym.c b/libelf/elf_getarsym.c
index 67b2697..1af1b1d 100644
--- a/libelf/elf_getarsym.c
+++ b/libelf/elf_getarsym.c
@@ -28,14 +28,11 @@
 #include <string.h>
 #include <unistd.h>
 
+#include <system.h>
 #include <dl-hash.h>
 #include "libelfP.h"
 
 
-#define pread_retry(fd, buf,  len, off) \
-  TEMP_FAILURE_RETRY (pread (fd, buf, len, off))
-
-
 Elf_Arsym *
 elf_getarsym (elf, ptr)
      Elf *elf;
diff --git a/libelf/elf_getdata.c b/libelf/elf_getdata.c
index 20e8e62..a21d1f9 100644
--- a/libelf/elf_getdata.c
+++ b/libelf/elf_getdata.c
@@ -19,11 +19,13 @@
 # include <config.h>
 #endif
 
+#include <errno.h>
 #include <stddef.h>
 #include <string.h>
 #include <unistd.h>
 
 #include "libelfP.h"
+#include <system.h>
 #include "common.h"
 #include "elf-knowledge.h"
 
@@ -239,7 +241,7 @@
       if (entsize == 0)
 	entsize = 1;
 
-      if (size % entsize != 0)
+      if (unlikely (size % entsize != 0))
 	{
 	  __libelf_seterrno (ELF_E_INVALID_DATA);
 	  return 1;
@@ -250,7 +252,7 @@
 	{
 	  /* First see whether the information in the section header is
 	     valid and it does not ask for too much.  */
-	  if (offset + size > elf->maximum_size)
+	  if (unlikely (offset + size > elf->maximum_size))
 	    {
 	      /* Something is wrong.  */
 	      __libelf_seterrno (ELF_E_INVALID_SECTION_HEADER);
@@ -260,7 +262,7 @@
 	  scn->rawdata_base = scn->rawdata.d.d_buf
 	    = (char *) elf->map_address + elf->start_offset + offset;
 	}
-      else if (elf->fildes != -1)
+      else if (likely (elf->fildes != -1))
 	{
 	  /* We have to read the data from the file.  Allocate the needed
 	     memory.  */
@@ -272,8 +274,9 @@
 	      return 1;
 	    }
 
-	  if ((size_t) pread (elf->fildes, scn->rawdata.d.d_buf, size,
-			      elf->start_offset + offset) != size)
+	  ssize_t n = pread_retry (elf->fildes, scn->rawdata.d.d_buf, size,
+				   elf->start_offset + offset);
+	  if (unlikely ((size_t) n != size))
 	    {
 	      /* Cannot read the data.  */
 	      free (scn->rawdata.d.d_buf);
diff --git a/libelf/elf_getshstrndx.c b/libelf/elf_getshstrndx.c
index 706092b..a765f4e 100644
--- a/libelf/elf_getshstrndx.c
+++ b/libelf/elf_getshstrndx.c
@@ -1,5 +1,5 @@
 /* Return section index of section header string table.
-   Copyright (C) 2002 Red Hat, Inc.
+   Copyright (C) 2002, 2005 Red Hat, Inc.
    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
 
    This program is free software; you can redistribute it and/or modify
@@ -20,10 +20,12 @@
 #endif
 
 #include <assert.h>
+#include <errno.h>
 #include <gelf.h>
 #include <stddef.h>
 #include <unistd.h>
 
+#include <system.h>
 #include "libelfP.h"
 #include "common.h"
 
@@ -100,8 +102,9 @@
 		     the first one.  */
 		  Elf32_Shdr shdr_mem;
 
-		  if (pread (elf->fildes, &shdr_mem, sizeof (Elf32_Shdr),
-			     offset) != sizeof (Elf32_Shdr))
+		  if (unlikely (pread_retry (elf->fildes, &shdr_mem,
+					     sizeof (Elf32_Shdr), offset)
+				!= sizeof (Elf32_Shdr)))
 		    {
 		      /* We must be able to read this ELF section header.  */
 		      __libelf_seterrno (ELF_E_INVALID_FILE);
@@ -116,15 +119,13 @@
 	    }
 	  else
 	    {
-	      size_t offset;
-
 	      if (elf->state.elf64.scns.data[0].shdr.e64 != NULL)
 		{
 		  num = elf->state.elf64.scns.data[0].shdr.e64->sh_link;
 		  goto success;
 		}
 
-	      offset = elf->state.elf64.ehdr->e_shoff;
+	      size_t offset = elf->state.elf64.ehdr->e_shoff;
 
 	      if (elf->map_address != NULL
 		  && elf->state.elf64.ehdr->e_ident[EI_DATA] == MY_ELFDATA
@@ -139,8 +140,9 @@
 		     the first one.  */
 		  Elf64_Shdr shdr_mem;
 
-		  if (pread (elf->fildes, &shdr_mem, sizeof (Elf64_Shdr),
-			     offset) != sizeof (Elf64_Shdr))
+		  if (unlikely (pread_retry (elf->fildes, &shdr_mem,
+					     sizeof (Elf64_Shdr), offset)
+				!= sizeof (Elf64_Shdr)))
 		    {
 		      /* We must be able to read this ELF section header.  */
 		      __libelf_seterrno (ELF_E_INVALID_FILE);
diff --git a/libelf/elf_readall.c b/libelf/elf_readall.c
index d36da27..efe44bf 100644
--- a/libelf/elf_readall.c
+++ b/libelf/elf_readall.c
@@ -1,5 +1,5 @@
 /* Read all of the file associated with the descriptor.
-   Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005 Red Hat, Inc.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 1998.
 
    This program is free software; you can redistribute it and/or modify
@@ -19,8 +19,10 @@
 # include <config.h>
 #endif
 
+#include <errno.h>
 #include <unistd.h>
 
+#include <system.h>
 #include "libelfP.h"
 #include "common.h"
 
@@ -78,8 +80,10 @@
       if (mem != NULL)
 	{
 	  /* Read the file content.  */
-	  if ((size_t) pread (elf->fildes, mem, elf->maximum_size,
-			      elf->start_offset) != elf->maximum_size)
+	  if (unlikely ((size_t) pread_retry (elf->fildes, mem,
+					      elf->maximum_size,
+					      elf->start_offset)
+			!= elf->maximum_size))
 	    {
 	      /* Something went wrong.  */
 	      __libelf_seterrno (ELF_E_READ_ERROR);
diff --git a/libelf/gelf_rawchunk.c b/libelf/gelf_rawchunk.c
index 667f301..6e05c0d 100644
--- a/libelf/gelf_rawchunk.c
+++ b/libelf/gelf_rawchunk.c
@@ -1,5 +1,5 @@
 /* Retrieve uninterpreted chunk of the file contents.
-   Copyright (C) 2002 Red Hat, Inc.
+   Copyright (C) 2002, 2005 Red Hat, Inc.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
    This program is free software; you can redistribute it and/or modify
@@ -19,11 +19,13 @@
 # include <config.h>
 #endif
 
+#include <errno.h>
 #include <libelf.h>
 #include <stddef.h>
 #include <stdlib.h>
 #include <unistd.h>
 
+#include <system.h>
 #include "libelfP.h"
 
 
@@ -40,9 +42,9 @@
       return NULL;
     }
 
-  if (offset >= elf->maximum_size
-      || offset + size >= elf->maximum_size
-      || offset + size < offset)
+  if (unlikely (offset >= elf->maximum_size
+		|| offset + size >= elf->maximum_size
+		|| offset + size < offset))
     {
       /* Invalid request.  */
       __libelf_seterrno (ELF_E_INVALID_OP);
@@ -59,8 +61,9 @@
     __libelf_seterrno (ELF_E_NOMEM);
   else
     /* Read the file content.  */
-    if ((size_t) pread (elf->fildes, result, size, elf->start_offset + offset)
-	!= size)
+    if (unlikely ((size_t) pread_retry (elf->fildes, result, size,
+					elf->start_offset + offset)
+		  != size))
       {
 	/* Something went wrong.  */
 	__libelf_seterrno (ELF_E_READ_ERROR);
diff --git a/src/ChangeLog b/src/ChangeLog
index 9494dd0..5ae77c4 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,7 @@
 2005-08-28  Ulrich Drepper  <drepper@redhat.com>
 
+	* ranlib.c: Don't define pread_retry and write_retry here.
+
 	* Makefile.an [BUILD_STATIC] (libdw): Add -ldl.
 	(CLEANFILES): Add *.gcno *.gcda *.gconv.
 
diff --git a/src/ranlib.c b/src/ranlib.c
index ce2e682..1914a17 100644
--- a/src/ranlib.c
+++ b/src/ranlib.c
@@ -40,11 +40,6 @@
 #include <system.h>
 
 
-#define pread_retry(fd, buf, n, off) \
-     TEMP_FAILURE_RETRY (pread (fd, buf, n, off))
-#define write_retry(fd, buf, n) \
-     TEMP_FAILURE_RETRY (write (fd, buf, n))
-
 #if __BYTE_ORDER == __LITTLE_ENDIAN
 # define le_bswap_32(val) bswap_32 (val)
 #else