Rename library_offset to library_fd_offset

 replace lseek() and use pread() instead
 add test for library_fd_offset > file_size case

Bug: 17762003
Change-Id: I4555f0be635124efe849c1f226985bcba72ffcbd
diff --git a/linker/linker.cpp b/linker/linker.cpp
index cd691af..41557e2 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -787,8 +787,8 @@
 
   if (extinfo != nullptr && (extinfo->flags & ANDROID_DLEXT_USE_LIBRARY_FD) != 0) {
     fd = extinfo->library_fd;
-    if ((extinfo->flags & ANDROID_DLEXT_USE_LIBRARY_OFFSET) != 0) {
-      file_offset = extinfo->library_offset;
+    if ((extinfo->flags & ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET) != 0) {
+      file_offset = extinfo->library_fd_offset;
     }
   } else {
     // Open the file.
@@ -802,13 +802,13 @@
   }
 
   if ((file_offset % PAGE_SIZE) != 0) {
-    DL_ERR("file offset for the library %s is not page-aligned: %" PRId64, name, file_offset);
+    DL_ERR("file offset for the library \"%s\" is not page-aligned: %" PRId64, name, file_offset);
     return nullptr;
   }
 
   struct stat file_stat;
   if (TEMP_FAILURE_RETRY(fstat(fd, &file_stat)) != 0) {
-    DL_ERR("unable to stat file for the library %s: %s", name, strerror(errno));
+    DL_ERR("unable to stat file for the library \"%s\": %s", name, strerror(errno));
     return nullptr;
   }
 
@@ -1060,8 +1060,8 @@
       return nullptr;
     }
     if ((extinfo->flags & ANDROID_DLEXT_USE_LIBRARY_FD) == 0 &&
-        (extinfo->flags & ANDROID_DLEXT_USE_LIBRARY_OFFSET) != 0) {
-      DL_ERR("invalid extended flag combination (ANDROID_DLEXT_USE_LIBRARY_OFFSET without ANDROID_DLEXT_USE_LIBRARY_FD): 0x%" PRIx64, extinfo->flags);
+        (extinfo->flags & ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET) != 0) {
+      DL_ERR("invalid extended flag combination (ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET without ANDROID_DLEXT_USE_LIBRARY_FD): 0x%" PRIx64, extinfo->flags);
       return nullptr;
     }
   }
diff --git a/linker/linker_phdr.cpp b/linker/linker_phdr.cpp
index 6856405..61ae5ab 100644
--- a/linker/linker_phdr.cpp
+++ b/linker/linker_phdr.cpp
@@ -142,18 +142,12 @@
 }
 
 bool ElfReader::ReadElfHeader() {
-  off64_t actual_offset = lseek64(fd_, file_offset_, SEEK_SET);
-
-  if (actual_offset != file_offset_) {
-    DL_ERR("seek to %" PRId64 " failed: %s", file_offset_, strerror(errno));
-    return false;
-  }
-
-  ssize_t rc = TEMP_FAILURE_RETRY(read(fd_, &header_, sizeof(header_)));
+  ssize_t rc = TEMP_FAILURE_RETRY(pread64(fd_, &header_, sizeof(header_), file_offset_));
   if (rc < 0) {
     DL_ERR("can't read file \"%s\": %s", name_, strerror(errno));
     return false;
   }
+
   if (rc != sizeof(header_)) {
     DL_ERR("\"%s\" is too small to be an ELF executable: only found %zd bytes", name_,
            static_cast<size_t>(rc));