summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Rosin <peda@lysator.liu.se>2014-05-06 00:03:19 +0200
committerPeter Rosin <peda@lysator.liu.se>2014-05-06 00:03:19 +0200
commitda30ce4dc9554c80f1931600af2b8bbab486476e (patch)
treef8c5ce9c72a894d97dce17158e3859d70fca4732
parent5911665520a53415bafd8bb6da9989b5fe25df80 (diff)
downloadlibtool-da30ce4dc9554c80f1931600af2b8bbab486476e.tar.gz
libtool: speed up ltwrapper_script detection in execute mode
Execute mode is slow and might even DOS the computer in extreme cases when a parameter is a big binary file without newlines. Work around this with different truncation if a suitable dd utility is found. Fixes bug#13472 and bug#16662. Reported by Pavel Raiskup and Nick Bowler. * m4/libtool.m4 (_LT_PATH_DD): New macro, for finding a dd utility that works for the below purpose. (_LT_CMD_TRUNCATE): New macro, for finding out how to truncate binary pipes (fallback to the old sed truncation if no suitable dd is found in _LT_PATH_DD). (_LT_SETUP): Require _LT_CMD_TRUNCATE. (LT_INIT): Require Autoconf 2.62, as needed by _LT_PATH_DD. * build_aux/ltmain.in (func_lalib_p): Factor out the actual "generated by libtool" test into... (func_generated_by_libtool_p): ...this new function... (func_ltwrapper_script_p): ...so that it can be reused here, when truncating the pipe according to _LT_CMD_TRUNCATE. * THANKS: Update. Signed-off-by: Peter Rosin <peda@lysator.liu.se>
-rw-r--r--THANKS2
-rw-r--r--build-aux/ltmain.in14
-rw-r--r--m4/libtool.m440
3 files changed, 52 insertions, 4 deletions
diff --git a/THANKS b/THANKS
index e895aee9..85c51509 100644
--- a/THANKS
+++ b/THANKS
@@ -150,6 +150,7 @@
Mike Gorchak mike@malva.ua
Mike Frysinger vapier@gentoo.org
Mike Miller mtmiller@ieee.org
+ Nick Bowler nbowler@draconx.ca
Nix nix@esperi.org.uk
Olaf Lenz olenz@fias.uni-frankfurt.de
Olly Betts olly@muscat.co.uk
@@ -161,6 +162,7 @@
Paul Eggert eggert@twinsun.com
Paul Laight plaight@quantxautomation.co.uk
Paul Seidler sepek@lavabit.com
+ Pavel Raiskup praiskup@redhat.com
Paweł Daniluk pawel@bioexploratorium.pl
Peter Eisentraut peter_e@gmx.net
Peter Fritzsche peter.fritzsche@gmx.de
diff --git a/build-aux/ltmain.in b/build-aux/ltmain.in
index 3a0fb0c5..6af40877 100644
--- a/build-aux/ltmain.in
+++ b/build-aux/ltmain.in
@@ -570,6 +570,14 @@ $1
_LTECHO_EOF'
}
+# func_generated_by_libtool
+# True iff stdin has been generated by Libtool. This function is only
+# a basic sanity check; it will hardly flush out determined imposters.
+func_generated_by_libtool_p ()
+{
+ $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
# func_lalib_p file
# True iff FILE is a libtool '.la' library or '.lo' object file.
# This function is only a basic sanity check; it will hardly flush out
@@ -577,8 +585,7 @@ _LTECHO_EOF'
func_lalib_p ()
{
test -f "$1" &&
- $SED -e 4q "$1" 2>/dev/null \
- | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+ $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p
}
# func_lalib_unsafe_p file
@@ -610,7 +617,8 @@ func_lalib_unsafe_p ()
# determined imposters.
func_ltwrapper_script_p ()
{
- func_lalib_p "$1"
+ test -f "$1" &&
+ $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p
}
# func_ltwrapper_executable_p file
diff --git a/m4/libtool.m4 b/m4/libtool.m4
index ce58f318..0454030a 100644
--- a/m4/libtool.m4
+++ b/m4/libtool.m4
@@ -59,7 +59,7 @@ esac
# LT_INIT([OPTIONS])
# ------------------
AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
AC_BEFORE([$0], [LT_LANG])dnl
AC_BEFORE([$0], [LT_OUTPUT])dnl
@@ -169,6 +169,7 @@ m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
m4_require([_LT_CMD_OLD_ARCHIVE])dnl
m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
m4_require([_LT_WITH_SYSROOT])dnl
+m4_require([_LT_CMD_TRUNCATE])dnl
_LT_CONFIG_LIBTOOL_INIT([
# See if we are running on zsh, and set the options that allow our
@@ -3216,6 +3217,43 @@ _LT_TAGDECL([], [reload_cmds], [2])dnl
])# _LT_CMD_RELOAD
+# _LT_PATH_DD
+# -----------
+# find a working dd
+m4_defun([_LT_PATH_DD],
+[AC_CACHE_CHECK([for a working dd], [ac_cv_path_lt_DD],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd],
+[if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi])
+rm -f conftest.i conftest2.i conftest.out])
+])# _LT_PATH_DD
+
+
+# _LT_CMD_TRUNCATE
+# ----------------
+# find command to truncate a binary pipe
+m4_defun([_LT_CMD_TRUNCATE],
+[m4_require([_LT_PATH_DD])
+AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"])
+_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1],
+ [Command to truncate a binary pipe])
+])# _LT_CMD_TRUNCATE
+
+
# _LT_CHECK_MAGIC_METHOD
# ----------------------
# how to check for library dependencies