From: Dave Hart Date: Wed, 23 Mar 2011 20:22:57 +0000 (-0400) Subject: Fix for --gc-sections on NetBSD X-Git-Tag: release-2.0.11-stable~32 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6bb23e4bb17701ccc319c76797e4673897db8f77;p=libevent Fix for --gc-sections on NetBSD This patch fixes http://bugs.ntp.org/1844, works around http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=40401, by improving the test for support of --gc-sections to run a program which reads a file using stdio built with --gc-sections, instead of simply link the binary. This catches the buggy linker as the garbage collection removes a tag NetBSD uses to distinguish its own elf binaries from Linux ones, causing it to treat conftest as a Linux binary and run it with the wrong syscall table. --- diff --git a/configure.in b/configure.in index 3b7d1a58..340d9d23 100644 --- a/configure.in +++ b/configure.in @@ -662,26 +662,64 @@ LIBEVENT_GC_SECTIONS= if test "$GCC" = yes && test "$enable_function_sections" = 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 + #include + ]], + [[ + 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"