diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-08-20 20:43:16 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-08-20 20:43:16 +0200 |
commit | bcde93ac563844fdc48ab280d965b0084de01278 (patch) | |
tree | bd33e21d8126a25e5ef5f6c780897242f8c90951 /csu | |
parent | cd1b3ca856e24e560dfc4583b8ca6c744ab6f3e8 (diff) | |
parent | f76453c31593957fec1a99b986bfa5506618b79c (diff) |
Merge commit 'refs/top-bases/t/tls' into t/tls
Diffstat (limited to 'csu')
-rw-r--r-- | csu/Makefile | 60 | ||||
-rw-r--r-- | csu/Versions | 2 | ||||
-rw-r--r-- | csu/abi-note.S | 2 | ||||
-rw-r--r-- | csu/check_fds.c | 2 | ||||
-rw-r--r-- | csu/dso_handle.c | 2 | ||||
-rw-r--r-- | csu/elf-init.c | 2 | ||||
-rw-r--r-- | csu/errno-loc.c | 2 | ||||
-rw-r--r-- | csu/errno.c | 2 | ||||
-rw-r--r-- | csu/gmon-start.c | 2 | ||||
-rw-r--r-- | csu/init-first.c | 2 | ||||
-rw-r--r-- | csu/init.c | 2 | ||||
-rw-r--r-- | csu/libc-start.c | 16 | ||||
-rw-r--r-- | csu/libc-tls.c | 38 | ||||
-rw-r--r-- | csu/tst-atomic-long.c | 2 | ||||
-rw-r--r-- | csu/tst-atomic.c | 148 | ||||
-rw-r--r-- | csu/tst-empty.c | 7 | ||||
-rw-r--r-- | csu/version.c | 7 |
17 files changed, 209 insertions, 89 deletions
diff --git a/csu/Makefile b/csu/Makefile index 24f0974b54..9f0855a6ac 100644 --- a/csu/Makefile +++ b/csu/Makefile @@ -1,5 +1,5 @@ # Makefile for csu code for GNU C library. -# Copyright (C) 1995-2013 Free Software Foundation, Inc. +# Copyright (C) 1995-2015 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 @@ -24,33 +24,33 @@ subdir := csu +include ../Makeconfig + routines = init-first libc-start $(libc-init) sysdep version check_fds \ libc-tls elf-init dso_handle aux = errno elide-routines.os = libc-tls static-only-routines = elf-init csu-dummies = $(filter-out $(start-installed-name),crt1.o Mcrt1.o) -extra-objs = start.o gmon-start.o \ +extra-objs = start.o \ $(start-installed-name) g$(start-installed-name) $(csu-dummies) \ S$(start-installed-name) omit-deps = $(patsubst %.o,%,$(start-installed-name) g$(start-installed-name) \ b$(start-installed-name) $(csu-dummies) \ S$(start-installed-name)) install-lib = $(start-installed-name) g$(start-installed-name) $(csu-dummies) -generated = version-info.h -before-compile = $(objpfx)version-info.h +generated += version-info.h +before-compile += $(objpfx)version-info.h tests := tst-empty tst-atomic tst-atomic-long tests-static := tst-empty -all: # Make this the default target; it will be defined in Rules. - -include ../Makeconfig - ifeq (yes,$(build-shared)) -extra-objs += S$(start-installed-name) +extra-objs += S$(start-installed-name) gmon-start.os install-lib += S$(start-installed-name) generated += start.os +else +extra-objs += gmon-start.o endif ifneq ($(start-installed-name),$(static-start-installed-name)) @@ -97,10 +97,17 @@ endif # The profiling startfile is made by linking together the normal # startfile with gmon-start.o, which defines a constructor function # to turn on profiling code at startup. +ifeq (yes,$(build-shared)) +$(addprefix $(objpfx),$(sort g$(start-installed-name) \ + g$(static-start-installed-name))): \ + $(objpfx)g%: $(objpfx)S% $(objpfx)gmon-start.os + $(link-relocatable) +else $(addprefix $(objpfx),$(sort g$(start-installed-name) \ g$(static-start-installed-name))): \ $(objpfx)g%: $(objpfx)% $(objpfx)gmon-start.o $(link-relocatable) +endif # These extra files are sometimes expected by system standard linking # procedures, but we have nothing for them to do. So compile empty files. @@ -133,40 +140,7 @@ all-Banner-files = $(wildcard $(addsuffix /Banner,\ $(sysdeps-srcdirs)))) $(objpfx)version-info.h: $(common-objpfx)config.make $(all-Banner-files) $(make-target-directory) - (case $(config-os) in \ - linux*) version=`(printf '%s\n%s\n' \ - '#include <linux/version.h>' \ - UTS_RELEASE \ - | $(CC) $(CPPFLAGS) -O -E -P - -DNOT_IN_libc=1 | \ - sed -e 's/"\([^"]*\)".*/\1/p' -e d) 2>/dev/null`;\ - if [ -z "$$version" ]; then \ - version=`(printf '%s\n%s\n' \ - '#include <linux/version.h>' \ - LINUX_VERSION_CODE \ - | $(CC) $(CPPFLAGS) -O -E -P - -DNOT_IN_libc=1 \ - | sed -n -e '/^[123456789].*/p' \ - | awk '{v=$$1; \ - printf("%d.%d.%d\n", \ - v/65535, v/256%256, v%256)}') \ - 2>/dev/null`; \ - fi; \ - if [ -z "$$version" ]; then \ - if [ -r /proc/version ]; then \ - version=`sed 's/.*Linux version \([^ ]*\) .*/>>\1<</' \ - < /proc/version`; \ - else \ - version=`uname -r`; \ - fi; \ - fi; \ - os=`uname -s 2> /dev/null`; \ - if [ -z "$$os" ]; then \ - os=Linux; \ - fi; \ - printf '"Compiled on a %s %s system on %s.\\n"\n' \ - "$$os" "$$version" "`date +%Y-%m-%d`";; \ - *) ;; \ - esac; \ - files="$(all-Banner-files)"; \ + (files="$(all-Banner-files)"; \ if test -n "$$files"; then \ printf '"Available extensions:\\n"\n'; \ sed -e '/^#/d' -e 's/^[[:space:]]*/ /' \ diff --git a/csu/Versions b/csu/Versions index 4ddf0d5b0b..43010c3443 100644 --- a/csu/Versions +++ b/csu/Versions @@ -1,5 +1,3 @@ -%include <tls.h> - libc { GLIBC_2.0 { # helper functions diff --git a/csu/abi-note.S b/csu/abi-note.S index cbd9778715..5da3701fa1 100644 --- a/csu/abi-note.S +++ b/csu/abi-note.S @@ -1,5 +1,5 @@ /* Special .init and .fini section support. - Copyright (C) 1997-2013 Free Software Foundation, Inc. + Copyright (C) 1997-2015 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 diff --git a/csu/check_fds.c b/csu/check_fds.c index 9b83828a81..9271aaf959 100644 --- a/csu/check_fds.c +++ b/csu/check_fds.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2013 Free Software Foundation, Inc. +/* Copyright (C) 2000-2015 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 diff --git a/csu/dso_handle.c b/csu/dso_handle.c index 89bcf15696..43c414b0a2 100644 --- a/csu/dso_handle.c +++ b/csu/dso_handle.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002-2013 Free Software Foundation, Inc. +/* Copyright (C) 2002-2015 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 diff --git a/csu/elf-init.c b/csu/elf-init.c index 84700e6fff..a7e534da62 100644 --- a/csu/elf-init.c +++ b/csu/elf-init.c @@ -1,5 +1,5 @@ /* Startup support for ELF initializers/finalizers in the main executable. - Copyright (C) 2002-2013 Free Software Foundation, Inc. + Copyright (C) 2002-2015 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 diff --git a/csu/errno-loc.c b/csu/errno-loc.c index 695d8f6f16..b893e1babc 100644 --- a/csu/errno-loc.c +++ b/csu/errno-loc.c @@ -1,6 +1,6 @@ /* MT support function to get address of `errno' variable, non-threaded version. - Copyright (C) 1996-2013 Free Software Foundation, Inc. + Copyright (C) 1996-2015 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 diff --git a/csu/errno.c b/csu/errno.c index dbdcb4356d..1c354749bc 100644 --- a/csu/errno.c +++ b/csu/errno.c @@ -1,5 +1,5 @@ /* Definition of `errno' variable. Canonical version. - Copyright (C) 2002-2013 Free Software Foundation, Inc. + Copyright (C) 2002-2015 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 diff --git a/csu/gmon-start.c b/csu/gmon-start.c index 0c18321095..d733d91b79 100644 --- a/csu/gmon-start.c +++ b/csu/gmon-start.c @@ -1,5 +1,5 @@ /* Code to enable profiling at program startup. - Copyright (C) 1995-2013 Free Software Foundation, Inc. + Copyright (C) 1995-2015 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 diff --git a/csu/init-first.c b/csu/init-first.c index b4d22ce6aa..b3bacdd0e3 100644 --- a/csu/init-first.c +++ b/csu/init-first.c @@ -1,5 +1,5 @@ /* Initialization code run first thing by the ELF startup code. Common version - Copyright (C) 1995-2013 Free Software Foundation, Inc. + Copyright (C) 1995-2015 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 diff --git a/csu/init.c b/csu/init.c index 8e3a0b80ff..2fbbd5e36e 100644 --- a/csu/init.c +++ b/csu/init.c @@ -1,5 +1,5 @@ /* Special startup support. - Copyright (C) 1997-2013 Free Software Foundation, Inc. + Copyright (C) 1997-2015 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 diff --git a/csu/libc-start.c b/csu/libc-start.c index 46e56126bb..1e3b350e78 100644 --- a/csu/libc-start.c +++ b/csu/libc-start.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2013 Free Software Foundation, Inc. +/* Copyright (C) 1998-2015 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 @@ -20,6 +20,7 @@ #include <stdio.h> #include <unistd.h> #include <ldsodefs.h> +#include <exit-thread.h> extern void __libc_init_first (int argc, char **argv, char **envp); #ifndef SHARED @@ -216,7 +217,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), #endif /* Register the destructor of the dynamic linker if there is any. */ - if (__builtin_expect (rtld_fini != NULL, 1)) + if (__glibc_likely (rtld_fini != NULL)) __cxa_atexit ((void (*) (void *)) rtld_fini, NULL, NULL); #ifndef SHARED @@ -247,7 +248,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), #ifdef SHARED /* Auditing checkpoint: we have a new object. */ - if (__builtin_expect (GLRO(dl_naudit) > 0, 0)) + if (__glibc_unlikely (GLRO(dl_naudit) > 0)) { struct audit_ifaces *afct = GLRO(dl_audit); struct link_map *head = GL(dl_ns)[LM_ID_BASE]._ns_loaded; @@ -262,17 +263,20 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), #endif #ifdef SHARED - if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) + if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS)) GLRO(dl_debug_printf) ("\ntransferring control: %s\n\n", argv[0]); #endif +#ifndef SHARED + _dl_debug_initialize (0, LM_ID_BASE); +#endif #ifdef HAVE_CLEANUP_JMP_BUF /* Memory for the cancellation buffer. */ struct pthread_unwind_buf unwind_buf; int not_first_call; not_first_call = setjmp ((struct __jmp_buf_tag *) unwind_buf.cancel_jmp_buf); - if (__builtin_expect (! not_first_call, 1)) + if (__glibc_likely (! not_first_call)) { struct pthread *self = THREAD_SELF; @@ -311,7 +315,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), if (! atomic_decrement_and_test (ptr)) /* Not much left to do but to exit the thread, not the process. */ - __exit_thread (0); + __exit_thread (); } #else /* Nothing fancy, just call the function. */ diff --git a/csu/libc-tls.c b/csu/libc-tls.c index c37df67e6c..3f134252a3 100644 --- a/csu/libc-tls.c +++ b/csu/libc-tls.c @@ -1,5 +1,5 @@ /* Initialization code for TLS in statically linked application. - Copyright (C) 2002-2013 Free Software Foundation, Inc. + Copyright (C) 2002-2015 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 @@ -42,9 +42,6 @@ static struct struct dtv_slotinfo info[2 + TLS_SLOTINFO_SURPLUS]; } static_slotinfo; -/* Fake link map for the application. */ -static struct link_map static_map; - /* Highest dtv index currently needed. */ size_t _dl_tls_max_dtv_idx; @@ -141,7 +138,10 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) to request some surplus that permits dynamic loading of modules with IE-model TLS. */ #if TLS_TCB_AT_TP - tcb_offset = roundup (memsz + GL(dl_tls_static_size), tcbalign); + /* Align the TCB offset to the maximum alignment, as + _dl_allocate_tls_storage (in elf/dl-tls.c) does using __libc_memalign + and dl_tls_static_align. */ + tcb_offset = roundup (memsz + GL(dl_tls_static_size), max_align); tlsblock = __sbrk (tcb_offset + tcbsize + max_align); #elif TLS_DTV_AT_TP tcb_offset = roundup (tcbsize, align ?: 1); @@ -162,14 +162,16 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) _dl_static_dtv[0].counter = (sizeof (_dl_static_dtv) / sizeof (_dl_static_dtv[0])) - 2; // _dl_static_dtv[1].counter = 0; would be needed if not already done + struct link_map *main_map = GL(dl_ns)[LM_ID_BASE]._ns_loaded; + /* Initialize the TLS block. */ #if TLS_TCB_AT_TP _dl_static_dtv[2].pointer.val = ((char *) tlsblock + tcb_offset - roundup (memsz, align ?: 1)); - static_map.l_tls_offset = roundup (memsz, align ?: 1); + main_map->l_tls_offset = roundup (memsz, align ?: 1); #elif TLS_DTV_AT_TP _dl_static_dtv[2].pointer.val = (char *) tlsblock + tcb_offset; - static_map.l_tls_offset = tcb_offset; + main_map->l_tls_offset = tcb_offset; #else # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" #endif @@ -183,29 +185,27 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) #if TLS_TCB_AT_TP INSTALL_DTV ((char *) tlsblock + tcb_offset, _dl_static_dtv); - const char *lossage = TLS_INIT_TP ((char *) tlsblock + tcb_offset, 0); + const char *lossage = TLS_INIT_TP ((char *) tlsblock + tcb_offset); #elif TLS_DTV_AT_TP INSTALL_DTV (tlsblock, _dl_static_dtv); - const char *lossage = TLS_INIT_TP (tlsblock, 0); + const char *lossage = TLS_INIT_TP (tlsblock); #else # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" #endif if (__builtin_expect (lossage != NULL, 0)) __libc_fatal (lossage); - /* We have to create a fake link map which normally would be created - by the dynamic linker. It just has to have enough information to - make the TLS routines happy. */ - static_map.l_tls_align = align; - static_map.l_tls_blocksize = memsz; - static_map.l_tls_initimage = initimage; - static_map.l_tls_initimage_size = filesz; - static_map.l_type = lt_executable; - static_map.l_tls_modid = 1; + /* Update the executable's link map with enough information to make + the TLS routines happy. */ + main_map->l_tls_align = align; + main_map->l_tls_blocksize = memsz; + main_map->l_tls_initimage = initimage; + main_map->l_tls_initimage_size = filesz; + main_map->l_tls_modid = 1; init_slotinfo (); // static_slotinfo.si.slotinfo[1].gen = 0; already zero - static_slotinfo.si.slotinfo[1].map = &static_map; + static_slotinfo.si.slotinfo[1].map = main_map; memsz = roundup (memsz, align ?: 1); diff --git a/csu/tst-atomic-long.c b/csu/tst-atomic-long.c index 9865dd6be8..d13fb074c0 100644 --- a/csu/tst-atomic-long.c +++ b/csu/tst-atomic-long.c @@ -1,5 +1,5 @@ /* Tests for atomic.h macros. - Copyright (C) 2003-2013 Free Software Foundation, Inc. + Copyright (C) 2003-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. diff --git a/csu/tst-atomic.c b/csu/tst-atomic.c index da4ee4f267..83309ebc9d 100644 --- a/csu/tst-atomic.c +++ b/csu/tst-atomic.c @@ -1,5 +1,5 @@ /* Tests for atomic.h macros. - Copyright (C) 2003-2013 Free Software Foundation, Inc. + Copyright (C) 2003-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. @@ -28,7 +28,7 @@ static int do_test (void) { - atomic_t mem; + atomic_t mem, expected; int ret = 0; #ifdef atomic_compare_and_exchange_val_acq @@ -113,6 +113,22 @@ do_test (void) ret = 1; } + mem = 2; + if (atomic_exchange_and_add_acq (&mem, 11) != 2 + || mem != 13) + { + puts ("atomic_exchange_and_add test failed"); + ret = 1; + } + + mem = 2; + if (atomic_exchange_and_add_rel (&mem, 11) != 2 + || mem != 13) + { + puts ("atomic_exchange_and_add test failed"); + ret = 1; + } + mem = -21; atomic_add (&mem, 22); if (mem != 1) @@ -489,6 +505,134 @@ do_test (void) ret = 1; } + /* Tests for C11-like atomics. */ + mem = 11; + if (atomic_load_relaxed (&mem) != 11 || atomic_load_acquire (&mem) != 11) + { + puts ("atomic_load_{relaxed,acquire} test failed"); + ret = 1; + } + + atomic_store_relaxed (&mem, 12); + if (mem != 12) + { + puts ("atomic_store_relaxed test failed"); + ret = 1; + } + atomic_store_release (&mem, 13); + if (mem != 13) + { + puts ("atomic_store_release test failed"); + ret = 1; + } + + mem = 14; + expected = 14; + if (!atomic_compare_exchange_weak_relaxed (&mem, &expected, 25) + || mem != 25 || expected != 14) + { + puts ("atomic_compare_exchange_weak_relaxed test 1 failed"); + ret = 1; + } + if (atomic_compare_exchange_weak_relaxed (&mem, &expected, 14) + || mem != 25 || expected != 25) + { + puts ("atomic_compare_exchange_weak_relaxed test 2 failed"); + ret = 1; + } + mem = 14; + expected = 14; + if (!atomic_compare_exchange_weak_acquire (&mem, &expected, 25) + || mem != 25 || expected != 14) + { + puts ("atomic_compare_exchange_weak_acquire test 1 failed"); + ret = 1; + } + if (atomic_compare_exchange_weak_acquire (&mem, &expected, 14) + || mem != 25 || expected != 25) + { + puts ("atomic_compare_exchange_weak_acquire test 2 failed"); + ret = 1; + } + mem = 14; + expected = 14; + if (!atomic_compare_exchange_weak_release (&mem, &expected, 25) + || mem != 25 || expected != 14) + { + puts ("atomic_compare_exchange_weak_release test 1 failed"); + ret = 1; + } + if (atomic_compare_exchange_weak_release (&mem, &expected, 14) + || mem != 25 || expected != 25) + { + puts ("atomic_compare_exchange_weak_release test 2 failed"); + ret = 1; + } + + mem = 23; + if (atomic_exchange_acquire (&mem, 42) != 23 || mem != 42) + { + puts ("atomic_exchange_acquire test failed"); + ret = 1; + } + mem = 23; + if (atomic_exchange_release (&mem, 42) != 23 || mem != 42) + { + puts ("atomic_exchange_release test failed"); + ret = 1; + } + + mem = 23; + if (atomic_fetch_add_relaxed (&mem, 1) != 23 || mem != 24) + { + puts ("atomic_fetch_add_relaxed test failed"); + ret = 1; + } + mem = 23; + if (atomic_fetch_add_acquire (&mem, 1) != 23 || mem != 24) + { + puts ("atomic_fetch_add_acquire test failed"); + ret = 1; + } + mem = 23; + if (atomic_fetch_add_release (&mem, 1) != 23 || mem != 24) + { + puts ("atomic_fetch_add_release test failed"); + ret = 1; + } + mem = 23; + if (atomic_fetch_add_acq_rel (&mem, 1) != 23 || mem != 24) + { + puts ("atomic_fetch_add_acq_rel test failed"); + ret = 1; + } + + mem = 3; + if (atomic_fetch_and_acquire (&mem, 2) != 3 || mem != 2) + { + puts ("atomic_fetch_and_acquire test failed"); + ret = 1; + } + + mem = 4; + if (atomic_fetch_or_relaxed (&mem, 2) != 4 || mem != 6) + { + puts ("atomic_fetch_or_relaxed test failed"); + ret = 1; + } + mem = 4; + if (atomic_fetch_or_acquire (&mem, 2) != 4 || mem != 6) + { + puts ("atomic_fetch_or_acquire test failed"); + ret = 1; + } + + /* This is a single-threaded test, so we can't test the effects of the + fences. */ + atomic_thread_fence_acquire (); + atomic_thread_fence_release (); + atomic_thread_fence_seq_cst (); + return ret; } diff --git a/csu/tst-empty.c b/csu/tst-empty.c index 980dcd60fd..e99468eef9 100644 --- a/csu/tst-empty.c +++ b/csu/tst-empty.c @@ -1,6 +1,9 @@ /* The most useful C program known to man. */ -int -main (void) +static int +do_test (void) { return 0; } + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/csu/version.c b/csu/version.c index f8a1a4247d..da08129f26 100644 --- a/csu/version.c +++ b/csu/version.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992-2013 Free Software Foundation, Inc. +/* Copyright (C) 1992-2015 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 @@ -25,7 +25,7 @@ static const char __libc_version[] = VERSION; static const char banner[] = "GNU C Library "PKGVERSION RELEASE" release version "VERSION", by Roland McGrath et al.\n\ -Copyright (C) 2013 Free Software Foundation, Inc.\n\ +Copyright (C) 2015 Free Software Foundation, Inc.\n\ This is free software; see the source for copying conditions.\n\ There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\ PARTICULAR PURPOSE.\n\ @@ -34,9 +34,6 @@ Compiled by GNU CC version "__VERSION__".\n" #ifdef LIBC_ABIS_STRING LIBC_ABIS_STRING #endif -#ifdef GLIBC_OLDEST_ABI -"The oldest ABI supported: " GLIBC_OLDEST_ABI ".\n" -#endif "For bug reporting instructions, please see:\n\ "REPORT_BUGS_TO".\n"; |