This is the mail archive of the binutils-cvs@sourceware.org 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]

[binutils-gdb] Align offset passed to mmap


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=fe9057895e9224b764c905de470e0e38d6c5efac

commit fe9057895e9224b764c905de470e0e38d6c5efac
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Feb 10 05:28:26 2015 -0800

    Align offset passed to mmap
    
    Offset passed to mmap must be a multiple of the page size.  This patch
    aligns offset passed to mmap.
    
    	* plugin.c (get_view): Align offset passed to mmap.

Diff:
---
 ld/ChangeLog |  4 ++++
 ld/plugin.c  | 15 ++++++++++++---
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/ld/ChangeLog b/ld/ChangeLog
index bf59ab3..facbbc1 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,7 @@
+2015-02-10  H.J. Lu  <hongjiu.lu@intel.com>
+
+	* plugin.c (get_view): Align offset passed to mmap.
+
 2015-02-08  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* ldfile.c (ldfile_try_open_bfd): Don't call bfd_check_format
diff --git a/ld/plugin.c b/ld/plugin.c
index 5b8a7cf..3254817 100644
--- a/ld/plugin.c
+++ b/ld/plugin.c
@@ -499,6 +499,9 @@ get_view (const void *handle, const void **viewp)
   plugin_input_file_t *input = (plugin_input_file_t *) handle;
   char *buffer;
   size_t size = input->filesize;
+#if HAVE_GETPAGESIZE
+  off_t offset, bias;
+#endif
 
   ASSERT (called_plugin);
 
@@ -520,9 +523,15 @@ get_view (const void *handle, const void **viewp)
   input->view_buffer.offset = input->offset;
 
 #if HAVE_MMAP
-  buffer = mmap (NULL, size, PROT_READ, MAP_PRIVATE, input->fd,
-		 input->offset);
-  if (buffer == MAP_FAILED)
+# if HAVE_GETPAGESIZE
+  bias = input->offset % getpagesize ();;
+  offset = input->offset - bias;
+  size += bias;
+# endif
+  buffer = mmap (NULL, size, PROT_READ, MAP_PRIVATE, input->fd, offset);
+  if (buffer != MAP_FAILED)
+    buffer += bias;
+  else
 #endif
     {
       char *p;


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