summaryrefslogtreecommitdiff
path: root/csu
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2016-08-20 20:43:16 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2016-08-20 20:43:16 +0200
commitbcde93ac563844fdc48ab280d965b0084de01278 (patch)
treebd33e21d8126a25e5ef5f6c780897242f8c90951 /csu
parentcd1b3ca856e24e560dfc4583b8ca6c744ab6f3e8 (diff)
parentf76453c31593957fec1a99b986bfa5506618b79c (diff)
Merge commit 'refs/top-bases/t/tls' into t/tls
Diffstat (limited to 'csu')
-rw-r--r--csu/Makefile60
-rw-r--r--csu/Versions2
-rw-r--r--csu/abi-note.S2
-rw-r--r--csu/check_fds.c2
-rw-r--r--csu/dso_handle.c2
-rw-r--r--csu/elf-init.c2
-rw-r--r--csu/errno-loc.c2
-rw-r--r--csu/errno.c2
-rw-r--r--csu/gmon-start.c2
-rw-r--r--csu/init-first.c2
-rw-r--r--csu/init.c2
-rw-r--r--csu/libc-start.c16
-rw-r--r--csu/libc-tls.c38
-rw-r--r--csu/tst-atomic-long.c2
-rw-r--r--csu/tst-atomic.c148
-rw-r--r--csu/tst-empty.c7
-rw-r--r--csu/version.c7
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";