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

GNU C Library master sources branch master updated. glibc-2.20-170-g2581b98


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  2581b98ecb1f2b3669a4b88a605f763fa4e85ee6 (commit)
       via  533bb7c2ae156ff2d49b2e0b20b33810ba5e2721 (commit)
      from  fffa1cf8a7f95830d488d5fc6bf73cb9599143f4 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=2581b98ecb1f2b3669a4b88a605f763fa4e85ee6

commit 2581b98ecb1f2b3669a4b88a605f763fa4e85ee6
Author: Siddhesh Poyarekar <siddhesh@redhat.com>
Date:   Wed Nov 12 14:32:41 2014 +0530

    Use GOT instead of GOT12 all over
    
    GOT12 is a synonym for GOT, so just use GOT everywhere for
    consistency.  Generated code is unchanged on s390.

diff --git a/ChangeLog b/ChangeLog
index 803ccf0..874d2d9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2012-11-12  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+	* sysdeps/s390/s390-32/bcopy.S (__bcopy): Use GOT instead of
+	GOT12.
+	* sysdeps/s390/s390-32/dl-machine.h (elf_machine_load_address):
+	Likewise.
+	(_dl_start_user): Likewise.
+	* sysdeps/s390/s390-32/setjmp.S (__sigsetjmp): Likewise.
+
 2014-11-12  Carlos O'Donell  <carlos@redhat.com>
 	    Siddhesh Poyarekar  <siddhesh@redhat.com>
 
diff --git a/sysdeps/s390/s390-32/bcopy.S b/sysdeps/s390/s390-32/bcopy.S
index d4403dc..7f61bed 100644
--- a/sysdeps/s390/s390-32/bcopy.S
+++ b/sysdeps/s390/s390-32/bcopy.S
@@ -68,7 +68,7 @@ ENTRY(__bcopy)
 #ifdef PIC
         al     %r1,.L9-.L8(%r1)     # get address of global offset table
                                     # load address of memmove
-        l      %r1,memmove@GOT12(%r1)
+        l      %r1,memmove@GOT(%r1)
         br     %r1
 .L9:    .long  _GLOBAL_OFFSET_TABLE_-.L8
 #else
diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h
index 0fd5a4f..47f5874 100644
--- a/sysdeps/s390/s390-32/dl-machine.h
+++ b/sysdeps/s390/s390-32/dl-machine.h
@@ -76,7 +76,7 @@ elf_machine_load_address (void)
        "2: l     %0,4(1)\n"
        "   ar    %0,1\n"
        "   al    1,0(1)\n"
-       "   sl    %0,_dl_start@GOT12(1)"
+       "   sl    %0,_dl_start@GOT(1)"
        : "=&d" (addr) : : "1" );
   return addr;
 }
@@ -165,7 +165,7 @@ _dl_start_user:\n\
 	ar    %r12,%r13\n\
 	# See if we were run as a command with the executable file\n\
 	# name as an extra leading argument.\n\
-	l     %r1,_dl_skip_args@GOT12(0,%r12)\n\
+	l     %r1,_dl_skip_args@GOT(%r12)\n\
 	l     %r1,0(%r1)	# load _dl_skip_args\n\
 	ltr   %r1,%r1\n\
 	je    .L4		# Skip the arg adjustment if there were none.\n\
diff --git a/sysdeps/s390/s390-32/setjmp.S b/sysdeps/s390/s390-32/setjmp.S
index 3ebc813..c0cf3ab 100644
--- a/sysdeps/s390/s390-32/setjmp.S
+++ b/sysdeps/s390/s390-32/setjmp.S
@@ -76,7 +76,7 @@ ENTRY(__sigsetjmp)
 	basr   %r1,0
 .L0:    al     %r1,.L1 - .L0(0,%r1) /* get address of global offset table */
 				    /* get address of __sigjmp_save from got */
-	l      %r1,__sigjmp_save@GOT12(0,%r1)
+	l      %r1,__sigjmp_save@GOT(%r1)
 	br     %r1
 .L1:    .long  _GLOBAL_OFFSET_TABLE_ - .L0
 #else

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=533bb7c2ae156ff2d49b2e0b20b33810ba5e2721

commit 533bb7c2ae156ff2d49b2e0b20b33810ba5e2721
Author: Siddhesh Poyarekar <siddhesh@redhat.com>
Date:   Wed Nov 12 19:30:24 2014 +0530

    Fix stack alignment when loader is invoked directly
    
    The s390 ABI requires the stack pointer to be aligned at 8-bytes.
    When a program is invoked as an argument to the dynamic linker,
    _dl_start_user adjusts the stack to remove the dynamic linker
    arguments so that the program sees only its name and arguments.  This
    may result in the stack being misaligned since each argument shift is
    only a word and not a double-word.
    
    This is now fixed shifting argv and envp down instead of shifting argc
    up and reclaiming the stack.  This requires _dl_argv to be adjusted
    and hence, is no longer relro.

diff --git a/ChangeLog b/ChangeLog
index a7d3298..803ccf0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2014-11-12  Carlos O'Donell  <carlos@redhat.com>
+	    Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+	* sysdeps/s390/s390-32/dl-machine.h (_dl_start_user):
+	Move argv and envp down instead of moving argc up.
+	* sysdeps/s390/s390-32/dl-sysdep.h: New file.
+
 2014-11-12  Leonhard Holz  <leonhard.holz@web.de>
 
 	[BZ #17506]
diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h
index c56185c..0fd5a4f 100644
--- a/sysdeps/s390/s390-32/dl-machine.h
+++ b/sysdeps/s390/s390-32/dl-machine.h
@@ -166,18 +166,49 @@ _dl_start_user:\n\
 	# See if we were run as a command with the executable file\n\
 	# name as an extra leading argument.\n\
 	l     %r1,_dl_skip_args@GOT12(0,%r12)\n\
-	l     %r1,0(%r1)          # load _dl_skip_args\n\
+	l     %r1,0(%r1)	# load _dl_skip_args\n\
+	ltr   %r1,%r1\n\
+	je    .L4		# Skip the arg adjustment if there were none.\n\
 	# Get the original argument count.\n\
 	l     %r0,96(%r15)\n\
 	# Subtract _dl_skip_args from it.\n\
 	sr    %r0,%r1\n\
-	# Adjust the stack pointer to skip _dl_skip_args words.\n\
-	sll   %r1,2\n\
-	ar    %r15,%r1\n\
-	# Set the back chain to zero again\n\
-	xc    0(4,%r15),0(%r15)\n\
 	# Store back the modified argument count.\n\
 	st    %r0,96(%r15)\n\
+	# Copy argv and envp forward to account for skipped argv entries.\n\
+	# We skipped at least one argument or we would not get here.\n\
+	la    %r6,100(%r15)	# Destination pointer i.e. &argv[0]\n\
+	lr    %r5,%r6\n\
+	lr    %r0,%r1\n\
+	sll   %r0,2\n		# Number of skipped bytes.\n\
+	ar    %r5,%r0		# Source pointer = Dest + Skipped args.\n\
+	# argv copy loop:\n\
+.L1:	l     %r7,0(%r5)	# Load a word from the source.\n\
+	st    %r7,0(%r6)	# Store the word in the destination.\n\
+	ahi   %r5,4\n\
+	ahi   %r6,4\n\
+	ltr   %r7,%r7\n\
+	jne   .L1		# Stop after copying the NULL.\n\
+	# envp copy loop:\n\
+.L2:	l     %r7,0(%r5)	# Load a word from the source.\n\
+	st    %r7,0(%r6)	# Store the word in the destination.\n\
+	ahi   %r5,4\n\
+	ahi   %r6,4\n\
+	ltr   %r7,%r7\n\
+	jne   .L2		# Stop after copying the NULL.\n\
+	# Now we have to zero out the envp entries after NULL to allow\n\
+	# start.S to properly find auxv by skipping zeroes.\n\
+	# zero out loop:\n\
+	lhi   %r7,0\n\
+.L3:	st    %r7,0(%r6)	# Store zero.\n\
+	ahi   %r6,4		# Advance dest pointer.\n\
+	ahi   %r1,-1		# Subtract one from the word count.\n\
+	ltr   %r1,%r1\n\
+	jne    .L3		# Keep copying if the word count is non-zero.\n\
+	# Adjust _dl_argv\n\
+	la    %r6,100(%r15)\n\
+	l     %r1,_dl_argv@GOT(%r12)\n\
+	st    %r6,0(%r1)\n\
 	# The special initializer gets called with the stack just\n\
 	# as the application's entry point will see it; it can\n\
 	# switch stacks if it moves these contents over.\n\
@@ -185,7 +216,7 @@ _dl_start_user:\n\
 	# Call the function to run the initializers.\n\
 	# Load the parameters:\n\
 	# (%r2, %r3, %r4, %r5) = (_dl_loaded, argc, argv, envp)\n\
-	l     %r2,_rtld_local@GOT(%r12)\n\
+.L4:	l     %r2,_rtld_local@GOT(%r12)\n\
 	l     %r2,0(%r2)\n\
 	l     %r3,96(%r15)\n\
 	la    %r4,100(%r15)\n\
diff --git a/sysdeps/s390/s390-32/dl-sysdep.h b/sysdeps/s390/s390-32/dl-sysdep.h
new file mode 100644
index 0000000..b992778
--- /dev/null
+++ b/sysdeps/s390/s390-32/dl-sysdep.h
@@ -0,0 +1,23 @@
+/* System-specific settings for dynamic linker code.  S/390 version.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include_next <dl-sysdep.h>
+
+/* _dl_argv cannot be attribute_relro, because _dl_start_user
+   might write into it after _dl_start returns.  */
+#define DL_ARGV_NOT_RELRO 1

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                   |   16 +++++++++
 sysdeps/s390/s390-32/bcopy.S                |    2 +-
 sysdeps/s390/s390-32/dl-machine.h           |   49 ++++++++++++++++++++++-----
 sysdeps/{alpha => s390/s390-32}/dl-sysdep.h |    4 +-
 sysdeps/s390/s390-32/setjmp.S               |    2 +-
 5 files changed, 60 insertions(+), 13 deletions(-)
 copy sysdeps/{alpha => s390/s390-32}/dl-sysdep.h (88%)


hooks/post-receive
-- 
GNU C Library master sources


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