[dconf/wip/lantw/use-weak-symbols-in-gvdb] build: Use weak bindings in gvdb to fix linking with LLD



commit 49f4d916e1151af3975df52c522c69de98ed2fbb
Author: Ting-Wei Lan <lantw src gnome org>
Date:   Sun Oct 21 12:31:47 2018 +0800

    build: Use weak bindings in gvdb to fix linking with LLD
    
    Since tests/dconf-mock-gvdb.c has functions conflicting with the real
    gvdb and it is intended for the former to override the latter in tests,
    so we have to make functions in gvdb library have weak bindings instead
    of the default strong bindings to avoid duplicate symbol errors.
    
    This change should not affect exported symbols of shared libraries
    because these symbols are already have visibility set to hidden.
    
    Fixes https://gitlab.gnome.org/GNOME/dconf/issues/47

 gvdb/gvdb-reader.c |  1 +
 gvdb/gvdb-reader.h | 35 +++++++++++++++++++++++++----------
 2 files changed, 26 insertions(+), 10 deletions(-)
---
diff --git a/gvdb/gvdb-reader.c b/gvdb/gvdb-reader.c
index aa3154f..638649b 100644
--- a/gvdb/gvdb-reader.c
+++ b/gvdb/gvdb-reader.c
@@ -17,6 +17,7 @@
  * Author: Ryan Lortie <desrt desrt ca>
  */
 
+#define GVDB_USE_WEAK_SYMBOLS
 #include "gvdb-reader.h"
 #include "gvdb-format.h"
 
diff --git a/gvdb/gvdb-reader.h b/gvdb/gvdb-reader.h
index 3982773..fde39fb 100644
--- a/gvdb/gvdb-reader.h
+++ b/gvdb/gvdb-reader.h
@@ -22,40 +22,55 @@
 
 #include <glib.h>
 
+/* We cannot enable the weak attribute unconditionally here because both
+ * gvdb/gvdb-reader.c and tests/dconf-mock-gvdb.c include this file. The
+ * intention of using weak symbols here is to allow the latter to override
+ * functions defined in the former, so functions in tests/dconf-mock-gvdb.c
+ * must have strong bindings. */
+#ifdef GVDB_USE_WEAK_SYMBOLS
+# ifdef __GNUC__
+#  define G_GNUC_WEAK __attribute__((weak))
+# else
+#  define G_GNUC_WEAK
+# endif
+#else
+# define G_GNUC_WEAK
+#endif
+
 typedef struct _GvdbTable GvdbTable;
 
 G_BEGIN_DECLS
 
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL G_GNUC_WEAK
 GvdbTable *             gvdb_table_new_from_bytes                       (GBytes       *bytes,
                                                                          gboolean      trusted,
                                                                          GError      **error);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL G_GNUC_WEAK
 GvdbTable *             gvdb_table_new                                  (const gchar  *filename,
                                                                          gboolean      trusted,
                                                                          GError      **error);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL G_GNUC_WEAK
 void                    gvdb_table_free                                 (GvdbTable    *table);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL G_GNUC_WEAK
 gchar **                gvdb_table_get_names                            (GvdbTable    *table,
                                                                          gint         *length);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL G_GNUC_WEAK
 gchar **                gvdb_table_list                                 (GvdbTable    *table,
                                                                          const gchar  *key);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL G_GNUC_WEAK
 GvdbTable *             gvdb_table_get_table                            (GvdbTable    *table,
                                                                          const gchar  *key);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL G_GNUC_WEAK
 GVariant *              gvdb_table_get_raw_value                        (GvdbTable    *table,
                                                                          const gchar  *key);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL G_GNUC_WEAK
 GVariant *              gvdb_table_get_value                            (GvdbTable    *table,
                                                                          const gchar  *key);
 
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL G_GNUC_WEAK
 gboolean                gvdb_table_has_value                            (GvdbTable    *table,
                                                                          const gchar  *key);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL G_GNUC_WEAK
 gboolean                gvdb_table_is_valid                             (GvdbTable    *table);
 
 G_END_DECLS


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]