From 65fb46597e73d9070a9aa2d5040e16c33de0bc3f Mon Sep 17 00:00:00 2001 From: Andrew Senkevich Date: Mon, 29 Dec 2014 16:32:31 +0300 Subject: [PATCH] i386: Fixed build by GCC 5.0. Fixed 3 make check fails on glibc 32bit built by gcc 5.0 due to EBX was enabled for allocation (https://gcc.gnu.org/ml/gcc-patches/2014-10/msg00892.html). Tests elf/tst-tls3, elf/tst-execstack-needed, elf/tst-execstack-prog was failed because EBX was used as PIC register. ChangeLog: 2014-12-29 Andrew Senkevich * sysdeps/i386/tls-macros.h (TLS_IE, TLS_LD, TLS_GD): Keep define in PIC mode only if gcc version < 5.0 * sysdeps/i386/sysdep.h (SETUP_PIC_REG_STR, LOAD_PIC_REG_STR): Keep define only if gcc version < 5.0 * sysdeps/unix/sysv/linux/i386/sysdep.h (check_consistency): Likewise. --- sysdeps/i386/sysdep.h | 34 ++++++++++++++++++---------------- sysdeps/i386/tls-macros.h | 8 +++++--- sysdeps/unix/sysv/linux/i386/sysdep.h | 2 +- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/sysdeps/i386/sysdep.h b/sysdeps/i386/sysdep.h index 217e746..5bebc13 100644 --- a/sysdeps/i386/sysdep.h +++ b/sysdeps/i386/sysdep.h @@ -146,22 +146,24 @@ GET_PC_THUNK(reg): \ #else /* __ASSEMBLER__ */ -# define SETUP_PIC_REG_STR(reg) \ - ".ifndef " GET_PC_THUNK_STR (reg) "\n" \ - ".section .gnu.linkonce.t." GET_PC_THUNK_STR (reg) ",\"ax\",@progbits\n" \ - ".globl " GET_PC_THUNK_STR (reg) "\n" \ - ".hidden " GET_PC_THUNK_STR (reg) "\n" \ - ".p2align 4\n" \ - ".type " GET_PC_THUNK_STR (reg) ",@function\n" \ +# if !__GNUC_PREREQ (5, 0) +# define SETUP_PIC_REG_STR(reg) \ + ".ifndef " GET_PC_THUNK_STR (reg) "\n" \ + ".section .gnu.linkonce.t." GET_PC_THUNK_STR (reg) ",\"ax\",@progbits\n" \ + ".globl " GET_PC_THUNK_STR (reg) "\n" \ + ".hidden " GET_PC_THUNK_STR (reg) "\n" \ + ".p2align 4\n" \ + ".type " GET_PC_THUNK_STR (reg) ",@function\n" \ GET_PC_THUNK_STR (reg) ":" \ - "movl (%%esp), %%e" #reg "\n" \ - "ret\n" \ - ".size " GET_PC_THUNK_STR (reg) ", . - " GET_PC_THUNK_STR (reg) "\n" \ - ".previous\n" \ - ".endif\n" \ - "call " GET_PC_THUNK_STR (reg) - -# define LOAD_PIC_REG_STR(reg) \ - SETUP_PIC_REG_STR (reg) "\naddl $_GLOBAL_OFFSET_TABLE_, %%e" #reg + "movl (%%esp), %%e" #reg "\n" \ + "ret\n" \ + ".size " GET_PC_THUNK_STR (reg) ", . - " GET_PC_THUNK_STR (reg) "\n" \ + ".previous\n" \ + ".endif\n" \ + "call " GET_PC_THUNK_STR (reg) + +# define LOAD_PIC_REG_STR(reg) \ + SETUP_PIC_REG_STR (reg) "\naddl $_GLOBAL_OFFSET_TABLE_, %%e" #reg +# endif #endif /* __ASSEMBLER__ */ diff --git a/sysdeps/i386/tls-macros.h b/sysdeps/i386/tls-macros.h index 0b85738..053cba0 100644 --- a/sysdeps/i386/tls-macros.h +++ b/sysdeps/i386/tls-macros.h @@ -1,3 +1,5 @@ +#include /* For __GNUC_PREREQ. */ + #define TLS_LE(x) \ ({ int *__l; \ asm ("movl %%gs:0,%0\n\t" \ @@ -5,7 +7,7 @@ : "=r" (__l)); \ __l; }) -#ifdef PIC +#if defined PIC && !__GNUC_PREREQ (5,0) # define TLS_IE(x) \ ({ int *__l; \ asm ("movl %%gs:0,%0\n\t" \ @@ -27,7 +29,7 @@ __l; }) #endif -#ifdef PIC +#if defined PIC && !__GNUC_PREREQ (5,0) # define TLS_LD(x) \ ({ int *__l, __c, __d; \ asm ("leal " #x "@tlsldm(%%ebx),%%eax\n\t" \ @@ -51,7 +53,7 @@ __l; }) #endif -#ifdef PIC +#if defined PIC && !__GNUC_PREREQ (5,0) # define TLS_GD(x) \ ({ int *__l, __c, __d; \ asm ("leal " #x "@tlsgd(%%ebx),%%eax\n\t" \ diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h index d751c58..b574418 100644 --- a/sysdeps/unix/sysv/linux/i386/sysdep.h +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h @@ -502,7 +502,7 @@ asm (".L__X'%ebx = 1\n\t" #endif /* Consistency check for position-independent code. */ -#ifdef __PIC__ +#if defined __PIC__ && !__GNUC_PREREQ (5,0) # define check_consistency() \ ({ int __res; \ __asm__ __volatile__ \ -- 1.8.3.1