aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2021-04-21 21:54:03 +0200
committerTom de Vries <tdevries@suse.de>2021-04-21 21:54:03 +0200
commitff5075202958f78e1a0bb77405e19c347d1d0bbd (patch)
tree249d9977387c8f6c777d8c78f633c9bbef8f421f
parent18e9a809e864e68ed999f3a9a06dce55b7a2c0f4 (diff)
downloadfsf-binutils-gdb-ff5075202958f78e1a0bb77405e19c347d1d0bbd.zip
fsf-binutils-gdb-ff5075202958f78e1a0bb77405e19c347d1d0bbd.tar.gz
fsf-binutils-gdb-ff5075202958f78e1a0bb77405e19c347d1d0bbd.tar.bz2
[gdb/build] Hardcode --with-included-regex
Currently gdb has a configure option: ... $ ./src/gdb/configure --help ... --without-included-regex don't use included regex; this is the default on systems with version 2 of the GNU C library (use with caution on other system) ... The configure option controls config.h macro USE_INCLUDED_REGEX, which is used in gdb/gdb_regex.h to choose between: - using regex from libiberty (which is included in the binutils-gdb.git repo, hence the 'included' in USE_INCLUDED_REGEX), or - using regex.h. In the former case, the symbol regcomp is remapped to a symbol xregcomp, which is then provided by libiberty. In the latter case, the symbol regcomp is resolved at runtime, usually binding to libc. However, there is no mechanism in place to enforce this. PR27681 is an example of where that causes problems. On openSUSE Tumbleweed, the ncurses package got the --with-pcre2 configure switch enabled, and solved the resulting dependencies using: ... $ cat /usr/lib64/libncursesw.so /* GNU ld script */ -INPUT(/lib64/libncursesw.so.6 AS_NEEDED(-ltinfo -ldl)) +INPUT(/lib64/libncursesw.so.6 AS_NEEDED(-ltinfo -ldl -lpcre2-posix -lpcre2-8)) ... This lead to regcomp being bound to libpcre2-posix instead of libc. This causes problems in several ways: - by compiling using regex.h, we've already chosen a specific regex_t implementation, and the one from pcre2-posix is not the same. - in gdb_regex.c we use GNU regex function re_search, which pcre2-posix doesn't provide, so while regcomp binds to pcre2-posix, re_search binds to libc. A note on the latter: it's actually a bug to compile a regex using regcomp and then pass it to re_search. The GNU regex interface requires one to use re_compile_pattern or re_compile_fastmap. But as long we're using one of the GNU regex incarnations in gnulib, glibc or libiberty, we get away with this. The PR could be fixed by adding -lc in a specific position in the link line, to force regcomp to be bound to glibc. But this solution was considered in the discussion in the PR as being brittle, and possibly causing problems elsewhere. Another solution offered was to restrict regex usage to posix, and no longer use the GNU regex API. This however could mean having to reproduce some of that functionality locally, which would mean maintaining the same functionality in more than one place. The solution chosen here, is to hardcode --with-included-regex, that is, using libiberty. The option of using glibc for regex was introduced because glibc became the authorative source for GNU regex, so it offered the possibility to link against a more up-to-date regex version. In that aspect, this patch is a step back. But we have the option of using a more up-to-date regex version as a follow-up step: by using the regex from gnulib. Tested on x86_64-linux. gdb/ChangeLog: 2021-04-21 Tom de Vries <tdevries@suse.de> PR build/27681 * configure.ac: Remove --without-included-regex/--with-included-regex. * config.in: Regenerate. * configure: Regenerate. * gdb_regex.h: Assume USE_INCLUDED_REGEX is defined.
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/config.in3
-rwxr-xr-xgdb/configure59
-rw-r--r--gdb/configure.ac33
-rw-r--r--gdb/gdb_regex.h6
5 files changed, 8 insertions, 101 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 981fcb5..5e79712 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2021-04-21 Tom de Vries <tdevries@suse.de>
+
+ PR build/27681
+ * configure.ac: Remove --without-included-regex/--with-included-regex.
+ * config.in: Regenerate.
+ * configure: Regenerate.
+ * gdb_regex.h: Assume USE_INCLUDED_REGEX is defined.
+
2021-04-21 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* breakpoint.h (create_breakpoint): Add a new parameter,
diff --git a/gdb/config.in b/gdb/config.in
index db860c7..5d10377 100644
--- a/gdb/config.in
+++ b/gdb/config.in
@@ -725,9 +725,6 @@
/* Define if <thread_db.h> has the TD_VERSION error code. */
#undef THREAD_DB_HAS_TD_VERSION
-/* Define to 1 if the regex included in libiberty should be used. */
-#undef USE_INCLUDED_REGEX
-
/* Enable extensions on AIX 3, Interix. */
#ifndef _ALL_SOURCE
# undef _ALL_SOURCE
diff --git a/gdb/configure b/gdb/configure
index 95fd6b0..b47de77 100755
--- a/gdb/configure
+++ b/gdb/configure
@@ -911,7 +911,6 @@ enable_source_highlight
with_intel_pt
with_libipt_prefix
with_libipt_type
-with_included_regex
with_sysroot
with_system_gdbinit
with_system_gdbinit_dir
@@ -1661,10 +1660,6 @@ Optional Packages:
--with-libipt-prefix[=DIR] search for libipt in DIR/include and DIR/lib
--without-libipt-prefix don't search for libipt in includedir and libdir
--with-libipt-type=TYPE type of library to search for (auto/static/shared)
- --without-included-regex
- don't use included regex; this is the default on
- systems with version 2 of the GNU C library (use
- with caution on other system)
--with-sysroot[=DIR] search for usr/lib et al within DIR
--with-system-gdbinit=PATH
automatically load a system-wide gdbinit file
@@ -15891,60 +15886,6 @@ if test "$ac_cv_func_setpgrp_void" = yes; then
fi
fi
-# Assume we'll default to using the included libiberty regex.
-gdb_use_included_regex=yes
-
-# However, if the system regex is GNU regex, then default to *not*
-# using the included regex.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU regex" >&5
-$as_echo_n "checking for GNU regex... " >&6; }
-if ${gdb_cv_have_gnu_regex+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <gnu-versions.h>
-int
-main ()
-{
-#define REGEX_INTERFACE_VERSION 1
- #if _GNU_REGEX_INTERFACE_VERSION != REGEX_INTERFACE_VERSION
- # error "Version mismatch"
- #endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- gdb_cv_have_gnu_regex=yes
-else
- gdb_cv_have_gnu_regex=no
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gdb_cv_have_gnu_regex" >&5
-$as_echo "$gdb_cv_have_gnu_regex" >&6; }
-if test "$gdb_cv_have_gnu_regex" = yes; then
- gdb_use_included_regex=no
-fi
-
-
-# Check whether --with-included-regex was given.
-if test "${with_included_regex+set}" = set; then :
- withval=$with_included_regex; gdb_with_regex=$withval
-else
- gdb_with_regex=$gdb_use_included_regex
-fi
-
-if test "$gdb_with_regex" = yes; then
-
-$as_echo "#define USE_INCLUDED_REGEX 1" >>confdefs.h
-
-fi
-
# Check if <sys/proc.h> defines `struct thread' with a td_pcb member.
ac_fn_c_check_member "$LINENO" "struct thread" "td_pcb" "ac_cv_member_struct_thread_td_pcb" "#include <sys/param.h>
#include <sys/proc.h>
diff --git a/gdb/configure.ac b/gdb/configure.ac
index 12a59ee..acfbe4a 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -1363,39 +1363,6 @@ if test "$ac_cv_func_setpgrp_void" = yes; then
fi
fi
-# Assume we'll default to using the included libiberty regex.
-gdb_use_included_regex=yes
-
-# However, if the system regex is GNU regex, then default to *not*
-# using the included regex.
-AC_CACHE_CHECK(
- [for GNU regex],
- [gdb_cv_have_gnu_regex],
- [AC_COMPILE_IFELSE(
- [AC_LANG_PROGRAM(
- [#include <gnu-versions.h>],
- [#define REGEX_INTERFACE_VERSION 1
- #if _GNU_REGEX_INTERFACE_VERSION != REGEX_INTERFACE_VERSION
- # error "Version mismatch"
- #endif]
- )],
- [gdb_cv_have_gnu_regex=yes],
- [gdb_cv_have_gnu_regex=no]
- )]
-)
-if test "$gdb_cv_have_gnu_regex" = yes; then
- gdb_use_included_regex=no
-fi
-
-AC_ARG_WITH(included-regex,
- AS_HELP_STRING([--without-included-regex], [don't use included regex; this is the default on systems with version 2 of the GNU C library (use with caution on other system)]),
- gdb_with_regex=$withval,
- gdb_with_regex=$gdb_use_included_regex)
-if test "$gdb_with_regex" = yes; then
- AC_DEFINE(USE_INCLUDED_REGEX, 1,
- [Define to 1 if the regex included in libiberty should be used.])
-fi
-
# Check if <sys/proc.h> defines `struct thread' with a td_pcb member.
AC_CHECK_MEMBERS([struct thread.td_pcb], [], [],
[#include <sys/param.h>
diff --git a/gdb/gdb_regex.h b/gdb/gdb_regex.h
index afe9909..0cac96e 100644
--- a/gdb/gdb_regex.h
+++ b/gdb/gdb_regex.h
@@ -19,13 +19,7 @@
#ifndef GDB_REGEX_H
#define GDB_REGEX_H 1
-#ifdef USE_INCLUDED_REGEX
# include "xregex.h"
-#else
-/* Request 4.2 BSD regex functions. */
-# define _REGEX_RE_COMP
-# include <regex.h>
-#endif
/* A compiled regex. This is mainly a wrapper around regex_t. The
the constructor throws on regcomp error and the destructor is