diff options
author | Pedro Alves <palves@redhat.com> | 2015-02-09 13:22:27 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2015-02-27 17:31:45 +0000 |
commit | 7cf99fb1c72769c17eed0a62951698bf56432108 (patch) | |
tree | d5a1add0bce7cbe9b49fe34a4f88a1ba17f2010b | |
parent | 1424c16eab1a96de054991c346c2bbf3eac82dec (diff) | |
download | gdb-7cf99fb1c72769c17eed0a62951698bf56432108.zip gdb-7cf99fb1c72769c17eed0a62951698bf56432108.tar.gz gdb-7cf99fb1c72769c17eed0a62951698bf56432108.tar.bz2 |
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 <palves@redhat.com>
* 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.
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/cp-valprint.c | 2 | ||||
-rw-r--r-- | gdb/features/feature_to_c.sh | 8 | ||||
-rw-r--r-- | gdb/guile/guile.c | 2 |
4 files changed, 16 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 39958bd..419ced4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2015-02-27 Pedro Alves <palves@redhat.com> + + * 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 <tromey@redhat.com> * minidebug.c (struct lzma_stream): Rename to ... diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c index 93f4c1b..0ddc96e 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 fb37a6b..35db791 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 3e0d11a..1895118 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", |