From 7cf99fb1c72769c17eed0a62951698bf56432108 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Mon, 9 Feb 2015 13:22:27 +0000 Subject: [PATCH] Exported const objects const works different in C vs C++. In C++, a global "const" variable has internal linkage by default, resulting in link errors like: ... extension.o: In function `get_ext_lang_defn(extension_language)': gdb/extension.c:126: undefined reference to `extension_language_guile' gdb/extension.c:124: undefined reference to `extension_language_guile' ... The fix is to define exported const objects with "extern const". But that in C would not be a definition. So we need to #ifdef C vs C++ in this case. EXPORTED_CONST comes from include/ansidecl.h, but in the feature_to_c.sh case I think it's better to leave the script with no dependencies. gdb/ChangeLog: 2015-02-27 Pedro Alves * cp-valprint.c (vtbl_ptr_name): Use EXPORTED_CONST. * guile/guile.c (extension_language_guile): Use EXPORTED_CONST. * features/feature_to_c.sh: Tag the generated xml_builtin array with extern const in C++ mode. --- gdb/ChangeLog | 7 +++++++ gdb/cp-valprint.c | 2 +- gdb/features/feature_to_c.sh | 8 +++++++- gdb/guile/guile.c | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 39958bd15a..419ced49f9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2015-02-27 Pedro Alves + + * cp-valprint.c (vtbl_ptr_name): Use EXPORTED_CONST. + * guile/guile.c (extension_language_guile): Use EXPORTED_CONST. + * features/feature_to_c.sh: Tag the generated xml_builtin array + with extern const in C++ mode. + 2015-02-27 Tom Tromey * minidebug.c (struct lzma_stream): Rename to ... diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c index 93f4c1bb8b..0ddc96e78b 100644 --- a/gdb/cp-valprint.c +++ b/gdb/cp-valprint.c @@ -88,7 +88,7 @@ static void cp_print_value (struct type *, struct type *, /* GCC versions after 2.4.5 use this. */ -const char vtbl_ptr_name[] = "__vtbl_ptr_type"; +EXPORTED_CONST char vtbl_ptr_name[] = "__vtbl_ptr_type"; /* Return truth value for assertion that TYPE is of the type "pointer to virtual function". */ diff --git a/gdb/features/feature_to_c.sh b/gdb/features/feature_to_c.sh index fb37a6b5e0..35db79177d 100644 --- a/gdb/features/feature_to_c.sh +++ b/gdb/features/feature_to_c.sh @@ -63,7 +63,13 @@ for input; do done echo >> $output -echo "const char *const xml_builtin[][2] = {" >> $output + +echo "#ifdef __cplusplus" >> $output +echo "# define EXPORTED_CONST extern const" >> $output +echo "#else" >> $output +echo "# define EXPORTED_CONST const" >> $output +echo "#endif" >> $output +echo "EXPORTED_CONST char *const xml_builtin[][2] = {" >> $output for input; do basename=`echo $input | sed 's,.*/,,'` diff --git a/gdb/guile/guile.c b/gdb/guile/guile.c index 3e0d11af10..1895118a77 100644 --- a/gdb/guile/guile.c +++ b/gdb/guile/guile.c @@ -77,7 +77,7 @@ extern const struct extension_language_ops guile_extension_ops; /* The main struct describing GDB's interface to the Guile extension language. */ -const struct extension_language_defn extension_language_guile = +EXPORTED_CONST struct extension_language_defn extension_language_guile = { EXT_LANG_GUILE, "guile",