]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
[Bug 1844] ntpd 4.2.7p131 NetBSD, ld --gc-sections links bad executable.
authorDave Hart <hart@ntp.org>
Mon, 21 Mar 2011 06:28:29 +0000 (06:28 +0000)
committerDave Hart <hart@ntp.org>
Mon, 21 Mar 2011 06:28:29 +0000 (06:28 +0000)
bk: 4d86f00dAtMyI33ZKd3tHN7HS672CQ

ChangeLog
sntp/libevent/Makefile.am
sntp/libevent/configure.in
sntp/m4/ntp_compiler.m4

index a778cc4882eec1a876962b2776d0cbaa64136564..ed402c8d9d4204b4bae1bce921b8a0b501059313 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,5 @@
+* [Bug 1844] ntpd 4.2.7p131 NetBSD, --gc-sections links bad executable.
+* Fix "make distcheck" break in libevent/sample caused by typo.
 (4.2.7p141) 2011/03/20 Released by Harlan Stenn <stenn@ntp.org>
 * Add "ntpq -c iostats" similar to "ntpdc -c iostats".
 * Compare entire timestamp to reject duplicates in refclock_pps().
index 5eb2ed820c67dd809662bff71fac9eac9a5f8548..9b048179b5f3bd857f0b1efcbd7b717a61c91d9d 100644 (file)
@@ -217,7 +217,7 @@ noinst_HEADERS = util-internal.h mm-internal.h ipv6-internal.h \
        WIN32-Code/tree.h \
        compat/sys/queue.h
 
-EVENT1_HDRs = event.h evhttp.h evdns.h evrpc.h evutil.h
+EVENT1_HDRS = event.h evhttp.h evdns.h evrpc.h evutil.h
 
 if INSTALL_LIBEVENT
 include_HEADERS = $(EVENT1_HDRS)
index d856f0514fc26db0c6031eb4444d0a2cb1c2067c..cd8711e5055fa3f78ca96b2b2a03c7a9894f7f9b 100644 (file)
@@ -677,26 +677,64 @@ LIBEVENT_GC_SECTIONS=
 if test "$GCC" = yes ; then
     AC_CACHE_CHECK(
        [if linker supports omitting unused code and data],
-       [libevent_cv_gc_sections_works],
+       [libevent_cv_gc_sections_runs],
        [
+           dnl  NetBSD will link but likely not run with --gc-sections
+           dnl  http://bugs.ntp.org/1844
+           dnl  http://gnats.netbsd.org/40401
+           dnl  --gc-sections causes attempt to load as linux elf, with
+           dnl  wrong syscalls in place.  Test a little gauntlet of
+           dnl  simple stdio read code checking for errors, expecting
+           dnl  enough syscall differences that the NetBSD code will
+           dnl  fail even with Linux emulation working as designed.
+           dnl  A shorter test could be refined by someone with access
+           dnl  to a NetBSD host with Linux emulation working.
            origCFLAGS="$CFLAGS"
            CFLAGS="$CFLAGS -Wl,--gc-sections"
            AC_LINK_IFELSE(
-               [AC_LANG_PROGRAM([[]], [[]])],
+               [AC_LANG_PROGRAM(
+                   [[
+                       #include <stdlib.h>
+                       #include <stdio.h>
+                   ]],
+                   [[
+                       FILE *  fpC;
+                       char    buf[32];
+                       size_t  cch;
+                       int     read_success_once;
+
+                       fpC = fopen("conftest.c", "r");
+                       if (NULL == fpC)
+                               exit(1);
+                       do {
+                               cch = fread(buf, sizeof(buf), 1, fpC);
+                               read_success_once |= (0 != cch);
+                       } while (0 != cch);
+                       if (!read_success_once)
+                               exit(2);
+                       if (!feof(fpC))
+                               exit(3);
+                       if (0 != fclose(fpC))
+                               exit(4);
+
+                       exit(EXIT_SUCCESS);
+                   ]]
+               )],
                [
-                   if grep gc-sections conftest.err ; then
-                       libevent_cv_gc_sections_works=no
+                   if test "X$cross_compiling" = "Xyes" || grep gc-sections conftest.err ; then
+                       libevent_cv_gc_sections_runs=no
                    else
-                       libevent_cv_gc_sections_works=yes
+                       libevent_cv_gc_sections_runs=no
+                       ./conftest >/dev/null 2>&1 && libevent_cv_gc_sections_runs=yes
                    fi
                ],
-               [libevent_cv_gc_sections_works=no]
+               [libevent_cv_gc_sections_runs=no]
            )
            CFLAGS="$origCFLAGS"
            AS_UNSET([origCFLAGS])
        ]
     )
-    case "$libevent_cv_gc_sections_works" in
+    case "$libevent_cv_gc_sections_runs" in
      yes)
        CFLAGS="-ffunction-sections -fdata-sections $CFLAGS"
        LIBEVENT_GC_SECTIONS="-Wl,--gc-sections"
index 7727d3f561a35cb8dbfa6088bd986d40fa3ef663..c69b2b0ee48dd8be64962935bb488e67e508340d 100644 (file)
@@ -67,26 +67,64 @@ case "$GCC" in
     #
     AC_CACHE_CHECK(
        [if linker supports omitting unused code and data],
-       [ntp_cv_gc_sections_works],
+       [ntp_cv_gc_sections_runs],
        [
+           dnl  NetBSD will link but likely not run with --gc-sections
+           dnl  http://bugs.ntp.org/1844
+           dnl  http://gnats.netbsd.org/40401
+           dnl  --gc-sections causes attempt to load as linux elf, with
+           dnl  wrong syscalls in place.  Test a little gauntlet of
+           dnl  simple stdio read code checking for errors, expecting
+           dnl  enough syscall differences that the NetBSD code will
+           dnl  fail even with Linux emulation working as designed.
+           dnl  A shorter test could be refined by someone with access
+           dnl  to a NetBSD host with Linux emulation working.
            origCFLAGS="$CFLAGS"
            CFLAGS="$CFLAGS -Wl,--gc-sections"
            AC_LINK_IFELSE(
-               [AC_LANG_PROGRAM([[]], [[]])],
+               [AC_LANG_PROGRAM(
+                   [[
+                       #include <stdlib.h>
+                       #include <stdio.h>
+                   ]],
+                   [[
+                       FILE *  fpC;
+                       char    buf[32];
+                       size_t  cch;
+                       int     read_success_once;
+
+                       fpC = fopen("conftest.c", "r");
+                       if (NULL == fpC)
+                               exit(1);
+                       do {
+                               cch = fread(buf, sizeof(buf), 1, fpC);
+                               read_success_once |= (0 != cch);
+                       } while (0 != cch);
+                       if (!read_success_once)
+                               exit(2);
+                       if (!feof(fpC))
+                               exit(3);
+                       if (0 != fclose(fpC))
+                               exit(4);
+
+                       exit(EXIT_SUCCESS);
+                   ]]
+               )],
                [
-                   if grep gc-sections conftest.err ; then
-                       ntp_cv_gc_sections_works=no
+                   if test "X$cross_compiling" = "Xyes" || grep gc-sections conftest.err ; then
+                       ntp_cv_gc_sections_runs=no
                    else
-                       ntp_cv_gc_sections_works=yes
+                       ntp_cv_gc_sections_runs=no
+                       ./conftest >/dev/null 2>&1 && ntp_cv_gc_sections_runs=yes
                    fi
                ],
-               [ntp_cv_gc_sections_works=no]
+               [ntp_cv_gc_sections_runs=no]
            )
            CFLAGS="$origCFLAGS"
            AS_UNSET([origCFLAGS])
        ]
     )
-    case "$ntp_cv_gc_sections_works" in
+    case "$ntp_cv_gc_sections_runs" in
      yes)
        LDADD_LIBNTP="-Wl,--gc-sections"
        CFLAGS_NTP="$CFLAGS_NTP -ffunction-sections -fdata-sections"