about summary refs log tree commit diff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-05-22 17:46:42 -0700
committerH.J. Lu <hjl.tools@gmail.com>2015-05-22 17:46:58 -0700
commit3e058c9d7eab6d6361e7cda5ba1394bc1757c9f6 (patch)
treeffd69b17e48ef749addd0e418b26c65ff84012f2
parent333e1ba4e53456a603621274177ae9393b9d5385 (diff)
downloadglibc-3e058c9d7eab6d6361e7cda5ba1394bc1757c9f6.tar.gz
glibc-3e058c9d7eab6d6361e7cda5ba1394bc1757c9f6.tar.xz
glibc-3e058c9d7eab6d6361e7cda5ba1394bc1757c9f6.zip
Don't issue an error if DT_PLTRELSZ is missing
A shared object doesn't need PLT if there are no PLT relocations.  It
shouldn't be an error if DT_PLTRELSZ is missing.

	[BZ #18410]
	* elf/dl-reloc.c (_dl_relocate_object): Don't issue an error
	for missing DT_PLTRELSZ.
-rw-r--r--ChangeLog6
-rw-r--r--NEWS4
-rw-r--r--elf/dl-reloc.c14
3 files changed, 11 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index f54645593f..4e289a0345 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2015-05-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+	[BZ #18410]
+	* elf/dl-reloc.c (_dl_relocate_object): Don't issue an error
+	for missing DT_PLTRELSZ.
+
 2015-05-22  Paul Eggert  <eggert@cs.ucla.edu>
 
 	Remove obsolete aliases that broke 'locale -a'
diff --git a/NEWS b/NEWS
index 529b79b2df..2e47f796c3 100644
--- a/NEWS
+++ b/NEWS
@@ -18,8 +18,8 @@ Version 2.22
   18029, 18030, 18032, 18036, 18038, 18039, 18042, 18043, 18046, 18047,
   18049, 18068, 18080, 18093, 18100, 18104, 18110, 18111, 18125, 18128,
   18138, 18185, 18196, 18197, 18206, 18210, 18211, 18217, 18220, 18221,
-  18244, 18247, 18287, 18319, 18333, 18346, 18397, 18409, 18412, 18418,
-  18434, 18444.
+  18244, 18247, 18287, 18319, 18333, 18346, 18397, 18409, 18410, 18412,
+  18418, 18434, 18444.
 
 * Cache information can be queried via sysconf() function on s390 e.g. with
   _SC_LEVEL1_ICACHE_SIZE as argument.
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index 0872636f16..61252d7697 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -258,21 +258,13 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
     ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling, skip_ifunc);
 
 #ifndef PROF
-    if (__glibc_unlikely (consider_profiling))
+    if (__glibc_unlikely (consider_profiling)
+	&& l->l_info[DT_PLTRELSZ] != NULL)
       {
 	/* Allocate the array which will contain the already found
 	   relocations.  If the shared object lacks a PLT (for example
 	   if it only contains lead function) the l_info[DT_PLTRELSZ]
 	   will be NULL.  */
-	if (l->l_info[DT_PLTRELSZ] == NULL)
-	  {
-	    errstring = N_("%s: no PLTREL found in object %s\n");
-	  fatal:
-	    _dl_fatal_printf (errstring,
-			      RTLD_PROGNAME,
-			      l->l_name);
-	  }
-
 	size_t sizeofrel = l->l_info[DT_PLTREL]->d_un.d_val == DT_RELA
 			   ? sizeof (ElfW(Rela))
 			   : sizeof (ElfW(Rel));
@@ -283,7 +275,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
 	  {
 	    errstring = N_("\
 %s: out of memory to store relocation results for %s\n");
-	    goto fatal;
+	    _dl_fatal_printf (errstring, RTLD_PROGNAME, l->l_name);
 	  }
       }
 #endif