From patchwork Thu Jun 8 12:02:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Liebler X-Patchwork-Id: 20848 Received: (qmail 127447 invoked by alias); 8 Jun 2017 12:02:18 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 125997 invoked by uid 89); 8 Jun 2017 12:02:16 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.3 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 spammy=bas X-HELO: mx0a-001b2d01.pphosted.com To: libc-alpha@sourceware.org Cc: schwab@linux-m68k.org From: Stefan Liebler Subject: [PATCH] S390: Fix build with gcc configured with --enable-default-pie. [BZ #21537] Date: Thu, 8 Jun 2017 14:02:11 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.0 MIME-Version: 1.0 X-TM-AS-GCONF: 00 x-cbid: 17060812-0020-0000-0000-0000038302A5 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17060812-0021-0000-0000-000041FE6043 Message-Id: X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-06-08_05:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1703280000 definitions=main-1706080216 Hi, Building glibc with gcc configured with --enable-default-pie failed on s390 due to assembler messages: ../sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S:44: Error: junk at end of line, first unrecognized character is `@' HIDDEN_JUMPTARGET was expanded to exit@PLT@GOTOFF. If SHARED is not defined, HIDDEN_JUMPTARGET is defined to JUMPTARGET in sysdeps/s390/s390-32/sysdep.h. There it expanded to exit@PLT in non SHARED case as PIC is defined if gcc is configured with --enable-default-pie. Thus I've changed the "ifdef PIC" to "ifdef SHARED" as we do not want PLTs in the static obj files. I've also changed this in sysdeps/s390/s390-64/sysdep.h. I've also adjusted sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S. If glibc is configured with --disable-hidden-plt, then NO_HIDDEN is defined. In SHARED case HIDDEN_JUMPTARGET would be expanded to exit@PLT@GOTOFF instead of __GI_exit@GOTOFF. Now we jump to: - __GI_exit if SHARED is defined - exit@PLT if SHARED and NO_HIDDEN is defined - exit if both are not defined. On s390 31bit we have to setup GOT pointer in r12 if we use a PLT stub. Therefore I use SYSCALL_PIC_SETUP from sysdep.h and added the missing semicolons. Question about glibc configure flag --disable-hidden-plt: Is this option supported or is it used by somebody? It defines NO_HIDDEN which influences the definition of HIDDEN_JUMPTARGET. I've tried to build glibc with this configure flag on s390, but it fails due to several reasons. The glibc internal symbols of the ifunc'ed symbols are generated by using __hidden_ver1 which does not exist if NO_HIDDEN is defined. Thus for further testing I've used --disable-multi-arch to avoid the ifuncs. Furthermore I get undefined references to __GI_memset/cpy/move due to asm ("memxyz = __GI_memxyz"); in sysdeps/generic/symbol-hacks.h. There are also undefined references to __nss_next2 and __inet6_scopeid_pton while linking nscd/nscd. Usually libc.so contains those symbols: xyz@@GLIBC_PRIVATE. But with --disable-hidden-plt those symbols are only local. For testing I've removed attribute_hidden at those prototypes. Then glibc builds and the testsuite runs without fails except elf/check-localplt which detects the PLTs due to --disable-hidden-plt. ChangeLog: [BZ #21537] * sysdeps/s390/s390-32/sysdep.h (JUMPTARGET, SYSCALL_PIC_SETUP): Check SHARED instead of PIC. (SYSCALL_PIC_SETUP): Add missing semicolons. * sysdeps/s390/s390-64/sysdep.h (JUMPTARGET, SYSCALL_PIC_SETUP): Check SHARED instead of PIC. * sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S (__makecontext_ret): Adjust code to jump to exit. commit a1d6669382f30e16edf787adfa87b6f77a309357 Author: Stefan Liebler Date: Thu Jun 8 13:13:27 2017 +0200 S390: Fix build with gcc configured with --enable-default-pie. [BZ #21537] Building glibc with gcc configured with --enable-default-pie failed on s390 due to assembler messages: ../sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S:44: Error: junk at end of line, first unrecognized character is `@' HIDDEN_JUMPTARGET was expanded to exit@PLT@GOTOFF. If SHARED is not defined, HIDDEN_JUMPTARGET is defined to JUMPTARGET in sysdeps/s390/s390-32/sysdep.h. There it expanded to exit@PLT in non SHARED case as PIC is defined if gcc is configured with --enable-default-pie. Thus I've changed the "ifdef PIC" to "ifdef SHARED" as we do not want PLTs in the static obj files. I've also changed this in sysdeps/s390/s390-64/sysdep.h. I've also adjusted sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S. If glibc is configured with --disable-hidden-plt, then NO_HIDDEN is defined. In SHARED case HIDDEN_JUMPTARGET would be expanded to exit@PLT@GOTOFF instead of __GI_exit@GOTOFF. Now we jump to: - __GI_exit if SHARED is defined - exit@PLT if SHARED and NO_HIDDEN is defined - exit if both are not defined. On s390 31bit we have to setup GOT pointer in r12 if we use a PLT stub. Therefore I use SYSCALL_PIC_SETUP from sysdep.h and added the missing semicolons. ChangeLog: [BZ #21537] * sysdeps/s390/s390-32/sysdep.h (JUMPTARGET, SYSCALL_PIC_SETUP): Check SHARED instead of PIC. (SYSCALL_PIC_SETUP): Add missing semicolons. * sysdeps/s390/s390-64/sysdep.h (JUMPTARGET, SYSCALL_PIC_SETUP): Check SHARED instead of PIC. * sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S (__makecontext_ret): Adjust code to jump to exit. diff --git a/sysdeps/s390/s390-32/sysdep.h b/sysdeps/s390/s390-32/sysdep.h index 15a4e3e..60cf1e7 100644 --- a/sysdeps/s390/s390-32/sysdep.h +++ b/sysdeps/s390/s390-32/sysdep.h @@ -82,14 +82,14 @@ lose: SYSCALL_PIC_SETUP \ END (name) #undef JUMPTARGET -#ifdef PIC +#ifdef SHARED #define JUMPTARGET(name) name##@PLT #define SYSCALL_PIC_SETUP \ - bras %r12,1f \ -0: .long _GLOBAL_OFFSET_TABLE_-0b \ + bras %r12,1f; \ +0: .long _GLOBAL_OFFSET_TABLE_-0b; \ 1: al %r12,0(%r12) #else -#define JUMPTARGET(name) name +#define JUMPTARGET(name) name #define SYSCALL_PIC_SETUP /* Nothing. */ #endif diff --git a/sysdeps/s390/s390-64/sysdep.h b/sysdeps/s390/s390-64/sysdep.h index a4dfc67..419cd01 100644 --- a/sysdeps/s390/s390-64/sysdep.h +++ b/sysdeps/s390/s390-64/sysdep.h @@ -77,7 +77,7 @@ lose: SYSCALL_PIC_SETUP \ END (name) #undef JUMPTARGET -#ifdef PIC +#ifdef SHARED #define JUMPTARGET(name) name##@PLT #define SYSCALL_PIC_SETUP \ larl %r12,_GLOBAL_OFFSET_TABLE_ diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S b/sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S index f32cd3c..887d841 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S +++ b/sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S @@ -32,25 +32,18 @@ ENTRY(__makecontext_ret) lr %r2,%r8 br %r9 1: lhi %r2,0 /* EXIT return value. */ - basr %r13,0 -2: -#ifdef PIC - l %r12,4f-2b(%r13) - la %r12,0(%r12,%r13) /* GOT pointer in r12 after this. */ - l %r1,3f-2b(%r13) - bas %r14,0(%r1,%r12) - .align 4 -3: - .long HIDDEN_JUMPTARGET (exit)@GOTOFF -4: - .long _GLOBAL_OFFSET_TABLE_-2b -#else - l %r1,3f-2b(%r13) - basr %r14,%r1 - .align 4 -3: - .long HIDDEN_JUMPTARGET (exit) +#ifdef NO_HIDDEN + /* If SHARED and NO_HIDDEN is defined, we need to setup got pointer + as HIDDEN_JUMPTARGET expands to JUMPTARGET which expands to + exit@PLT. Otherwise HIDDEN_JUMPTARGET expands to __GI_exit if + SHARED is defined and to exit if SHARED is not defined. */ + SYSCALL_PIC_SETUP #endif - .align 2 + basr %r1,0 +2: + al %r1,3f-2b(%r1) + basr %r14,%r1 /* Call exit. */ j .+2 /* Trap if exit returns for some reason. */ +3: + .long HIDDEN_JUMPTARGET (exit) - 2b END(__makecontext_ret)