aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/s390/s390-64/configure
blob: 824ae9c129f731e8f0143793256702ab6050b64f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
# This file is generated from configure.ac by Autoconf.  DO NOT EDIT!
 # Local configure fragment for sysdeps/s390/s390-64.

# Bypass result of runtime configure check for known linker versions as
# e.g. crt-files or libc.so might not be available in bootstrapping
# environments.
case $($LD --version) in
  "GNU gold"*)
    # As of 2023-08-07, gold does not support static PIE due to
    # Bug 22221 - add --no-dynamic-linker option
    # https://sourceware.org/bugzilla/show_bug.cgi?id=22221
    libc_cv_s390x_staticpie_req_version=no
    ;;
  "LLD"*)
    # As of 2023-08-07, there is no lld which supports s390x.
    libc_cv_s390x_staticpie_req_version=no
    ;;
  *)
    # The required binutils patches are available with bintuils 2.39
    libc_cv_s390x_staticpie_req_version=yes
    # Skip AC_CHECK_PROGS and just use the result from main configure.ac.
    libc_cv_s390x_staticpie_req_LD=$LD
    for ac_prog in $LD
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_libc_cv_s390x_staticpie_req_LD+y}
then :
  printf %s "(cached) " >&6
else $as_nop
  if test -n "$libc_cv_s390x_staticpie_req_LD"; then
  ac_cv_prog_libc_cv_s390x_staticpie_req_LD="$libc_cv_s390x_staticpie_req_LD" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_libc_cv_s390x_staticpie_req_LD="$ac_prog"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
libc_cv_s390x_staticpie_req_LD=$ac_cv_prog_libc_cv_s390x_staticpie_req_LD
if test -n "$libc_cv_s390x_staticpie_req_LD"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_s390x_staticpie_req_LD" >&5
printf "%s\n" "$libc_cv_s390x_staticpie_req_LD" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


  test -n "$libc_cv_s390x_staticpie_req_LD" && break
done

if test -z "$libc_cv_s390x_staticpie_req_LD"; then
  ac_verc_fail=yes
else
  # Found it, now check the version.
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking version of $libc_cv_s390x_staticpie_req_LD" >&5
printf %s "checking version of $libc_cv_s390x_staticpie_req_LD... " >&6; }
  ac_prog_version=`$libc_cv_s390x_staticpie_req_LD --version 2>&1 | sed -n 's/^.*GNU ld.* \([0-9][0-9]*\.[0-9.]*\).*$/\1/p'`
  case $ac_prog_version in
    '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
    2.1[0-9][0-9]*|2.39*|2.[4-9][0-9]*|[3-9].*|[1-9][0-9]*)
       ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
    *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;

  esac
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
printf "%s\n" "$ac_prog_version" >&6; }
fi
if test $ac_verc_fail = yes; then
  libc_cv_s390x_staticpie_req_version=no
fi

    ;;
esac
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for s390-specific static PIE requirements (version check)" >&5
printf %s "checking for s390-specific static PIE requirements (version check)... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_s390x_staticpie_req_version" >&5
printf "%s\n" "$libc_cv_s390x_staticpie_req_version" >&6; }

# Minimal checking for static PIE support in ld.
# Compare to ld testcase/bugzilla:
# <binutils-source>/ld/testsuite/ld-elf/pr22263-1.rd
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for s390-specific static PIE requirements (runtime check)" >&5
printf %s "checking for s390-specific static PIE requirements (runtime check)... " >&6; }
if { as_var=\
libc_cv_s390x_staticpie_req_runtime; eval test \${$as_var+y}; }
then :
  printf %s "(cached) " >&6
else $as_nop
    cat > conftest1.c <<EOF
__thread int * foo;

void
bar (void)
{
  *foo = 1;
}
EOF
  cat > conftest2.c <<EOF
extern __thread int *foo;
extern void bar (void);
static int x;

int
main ()
{
  foo = &x;
  return 0;
}
EOF
  libc_cv_s390x_staticpie_req_runtime=no
  if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fPIE -c conftest1.c -o conftest1.o'
  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; } \
     && { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fPIE -c conftest2.c -o conftest2.o'
  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; } \
     && { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -pie -o conftest conftest1.o conftest2.o'
  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; } \
     && { ac_try='! LC_ALL=C $READELF -Wr conftest | grep R_390_TLS_TPOFF'
  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; }
  then
    libc_cv_s390x_staticpie_req_runtime=yes
  fi
  rm -rf conftest.*
fi
eval ac_res=\$\
libc_cv_s390x_staticpie_req_runtime
	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
printf "%s\n" "$ac_res" >&6; }

if test $libc_cv_s390x_staticpie_req_runtime = yes \
   || test $libc_cv_s390x_staticpie_req_version = yes; then
   # Static PIE is supported only on 64bit.
   # Ensure you also have those patches for:
   # - binutils (ld)
   #   - "[PR ld/22263] s390: Avoid dynamic TLS relocs in PIE"
   #     https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=26b1426577b5dcb32d149c64cca3e603b81948a9
   #     (Tested by configure check above)
   #     Otherwise there will be a R_390_TLS_TPOFF relocation, which fails to
   #     be processed in _dl_relocate_static_pie() as static TLS map is not setup.
   #   - "s390: Add DT_JMPREL pointing to .rela.[i]plt with static-pie"
   #     https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=d942d8db12adf4c9e5c7d9ed6496a779ece7149e
   #     (We can't test it in configure as we are not able to link a static PIE
   #     executable if the system glibc lacks static PIE support)
   #     Otherwise there won't be DT_JMPREL, DT_PLTRELA, DT_PLTRELASZ entries
   #     and the IFUNC symbols are not processed, which leads to crashes.
   #
   # - kernel (the mentioned links to the commits belong to 5.19 merge window):
   #   - "s390/mmap: increase stack/mmap gap to 128MB"
   #     https://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git/commit/?h=features&id=f2f47d0ef72c30622e62471903ea19446ea79ee2
   #   - "s390/vdso: move vdso mapping to its own function"
   #     https://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git/commit/?h=features&id=57761da4dc5cd60bed2c81ba0edb7495c3c740b8
   #   - "s390/vdso: map vdso above stack"
   #     https://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git/commit/?h=features&id=9e37a2e8546f9e48ea76c839116fa5174d14e033
   #   - "s390/vdso: add vdso randomization"
   #     https://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git/commit/?h=features&id=41cd81abafdc4e58a93fcb677712a76885e3ca25
   #   (We can't test the kernel of the target system)
   #   Otherwise if /proc/sys/kernel/randomize_va_space is turned off (0),
   #   static PIE executables like ldconfig will crash.  While startup sbrk is
   #   used to enlarge the HEAP.  Unfortunately the underlying brk syscall fails
   #   as there is not enough space after the HEAP.  Then the address of the TLS
   #   image is invalid and the following memcpy in __libc_setup_tls() leads
   #   to a segfault.
   #   If /proc/sys/kernel/randomize_va_space is activated (default: 2), there
   #   is enough space after HEAP.
   #
   # - glibc
   #   - "Linux: Define MMAP_CALL_INTERNAL"
   #     https://sourceware.org/git/?p=glibc.git;a=commit;h=c1b68685d438373efe64e5f076f4215723004dfb
   #   - "i386: Remove OPTIMIZE_FOR_GCC_5 from Linux libc-do-syscall.S"
   #     https://sourceware.org/git/?p=glibc.git;a=commit;h=6e5c7a1e262961adb52443ab91bd2c9b72316402
   #   - "i386: Honor I386_USE_SYSENTER for 6-argument Linux system calls"
   #     https://sourceware.org/git/?p=glibc.git;a=commit;h=60f0f2130d30cfd008ca39743027f1e200592dff
   #   - "ia64: Always define IA64_USE_NEW_STUB as a flag macro"
   #     https://sourceware.org/git/?p=glibc.git;a=commit;h=18bd9c3d3b1b6a9182698c85354578d1d58e9d64
   #   - "Linux: Implement a useful version of _startup_fatal"
   #     https://sourceware.org/git/?p=glibc.git;a=commit;h=a2a6bce7d7e52c1c34369a7da62c501cc350bc31
   #   - "Linux: Introduce __brk_call for invoking the brk system call"
   #     https://sourceware.org/git/?p=glibc.git;a=commit;h=b57ab258c1140bc45464b4b9908713e3e0ee35aa
   #   - "csu: Implement and use _dl_early_allocate during static startup"
   #     https://sourceware.org/git/?p=glibc.git;a=commit;h=f787e138aa0bf677bf74fa2a08595c446292f3d7
   #   The mentioned patch series by Florian Weimer avoids the mentioned failing
   #   sbrk syscall by falling back to mmap.
   printf "%s\n" "#define SUPPORT_STATIC_PIE 1" >>confdefs.h

fi