File LTO-linking-fix.patch of Package libsigrok

From: Jiri Slaby <jslaby@suse.cz>
Subject: LTO: fix linking
References: https://sigrok.org/bugzilla/show_bug.cgi?id=1433

With LTO, the trick to collect drivers does not work. Use linker script
instead.

---
 Makefile.am             |   15 +++---------
 Makefile.in             |   56 +++++++++---------------------------------------
 src/driver_list_start.c |   33 ----------------------------
 src/driver_list_stop.c  |   33 ----------------------------
 src/drivers.c           |    2 -
 src/libdrivers.ld       |    9 +++++++
 6 files changed, 25 insertions(+), 123 deletions(-)

--- a/Makefile.am
+++ b/Makefile.am
@@ -173,22 +173,15 @@ libsigrok_la_SOURCES += \
 	src/scale/kern.c
 
 # Hardware drivers
-noinst_LTLIBRARIES = src/libdrivers.la \
-	src/libdrivers_head.la src/libdrivers_tail.la
+noinst_LTLIBRARIES = src/libdrivers.la
 
-src/libdrivers.o: src/libdrivers.la \
-		src/libdrivers_head.la src/libdrivers_tail.la
-	$(AM_V_CCLD)$(LINK) src/libdrivers_head.la src/libdrivers.la \
-		src/libdrivers_tail.la
+src/libdrivers.o: src/libdrivers.la
+	$(AM_V_CCLD)$(LINK) src/libdrivers.la
 src/libdrivers.lo: src/libdrivers.o
 	$(AM_V_GEN)echo "# Generated by libtool" > $@
 	$(AM_V_at)echo "pic_object='libdrivers.o'" >> $@
 	$(AM_V_at)echo "non_pic_object='libdrivers.o'" >> $@
 
-src_libdrivers_head_la_SOURCES = src/driver_list_start.c
-
-src_libdrivers_tail_la_SOURCES = src/driver_list_stop.c
-
 src_libdrivers_la_SOURCES = src/drivers.c
 
 if HW_AGILENT_DMM
@@ -604,7 +597,7 @@ src_libdrivers_la_SOURCES += \
 endif
 
 libsigrok_la_LIBADD = src/libdrivers.lo $(SR_EXTRA_LIBS) $(LIBSIGROK_LIBS)
-libsigrok_la_LDFLAGS = -version-info $(SR_LIB_VERSION) -no-undefined
+libsigrok_la_LDFLAGS = -version-info $(SR_LIB_VERSION) -no-undefined -Wc,-T -Wc,src/libdrivers.ld
 
 library_includedir = $(includedir)/libsigrok
 library_include_HEADERS = \
--- a/Makefile.in
+++ b/Makefile.in
@@ -1018,12 +1018,6 @@ am_src_libdrivers_la_OBJECTS = src/drive
 	$(am__objects_72) $(am__objects_73) $(am__objects_74) \
 	$(am__objects_75) $(am__objects_76)
 src_libdrivers_la_OBJECTS = $(am_src_libdrivers_la_OBJECTS)
-src_libdrivers_head_la_LIBADD =
-am_src_libdrivers_head_la_OBJECTS = src/driver_list_start.lo
-src_libdrivers_head_la_OBJECTS = $(am_src_libdrivers_head_la_OBJECTS)
-src_libdrivers_tail_la_LIBADD =
-am_src_libdrivers_tail_la_OBJECTS = src/driver_list_stop.lo
-src_libdrivers_tail_la_OBJECTS = $(am_src_libdrivers_tail_la_OBJECTS)
 am_tests_main_OBJECTS = tests/lib.$(OBJEXT) tests/main.$(OBJEXT) \
 	tests/core.$(OBJEXT) tests/input_all.$(OBJEXT) \
 	tests/input_binary.$(OBJEXT) tests/output_all.$(OBJEXT) \
@@ -1052,8 +1046,7 @@ am__maybe_remake_depfiles = depfiles
 am__depfiles_remade = bindings/cxx/$(DEPDIR)/classes.Plo \
 	src/$(DEPDIR)/analog.Plo src/$(DEPDIR)/backend.Plo \
 	src/$(DEPDIR)/conversion.Plo src/$(DEPDIR)/device.Plo \
-	src/$(DEPDIR)/driver_list_start.Plo \
-	src/$(DEPDIR)/driver_list_stop.Plo src/$(DEPDIR)/drivers.Plo \
+	src/$(DEPDIR)/drivers.Plo \
 	src/$(DEPDIR)/error.Plo src/$(DEPDIR)/ezusb.Plo \
 	src/$(DEPDIR)/fallback.Plo src/$(DEPDIR)/hwdriver.Plo \
 	src/$(DEPDIR)/log.Plo src/$(DEPDIR)/resource.Plo \
@@ -1287,13 +1279,10 @@ am__v_CXXLD_0 = @echo "  CXXLD   " $@;
 am__v_CXXLD_1 = 
 SOURCES = $(bindings_cxx_libsigrokcxx_la_SOURCES) \
 	$(libsigrok_la_SOURCES) $(src_libdrivers_la_SOURCES) \
-	$(src_libdrivers_head_la_SOURCES) \
-	$(src_libdrivers_tail_la_SOURCES) $(tests_main_SOURCES)
+	$(tests_main_SOURCES)
 DIST_SOURCES = $(am__bindings_cxx_libsigrokcxx_la_SOURCES_DIST) \
 	$(am__libsigrok_la_SOURCES_DIST) \
-	$(am__src_libdrivers_la_SOURCES_DIST) \
-	$(src_libdrivers_head_la_SOURCES) \
-	$(src_libdrivers_tail_la_SOURCES) $(tests_main_SOURCES)
+	$(am__src_libdrivers_la_SOURCES_DIST) $(tests_main_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -1691,7 +1680,6 @@ program_transform_name = @program_transf
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
-runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -1762,11 +1750,7 @@ libsigrok_la_SOURCES = src/backend.c src
 	src/scale/kern.c
 
 # Hardware drivers
-noinst_LTLIBRARIES = src/libdrivers.la \
-	src/libdrivers_head.la src/libdrivers_tail.la
-
-src_libdrivers_head_la_SOURCES = src/driver_list_start.c
-src_libdrivers_tail_la_SOURCES = src/driver_list_stop.c
+noinst_LTLIBRARIES = src/libdrivers.la
 src_libdrivers_la_SOURCES = src/drivers.c $(am__append_9) \
 	$(am__append_10) $(am__append_11) $(am__append_12) \
 	$(am__append_13) $(am__append_14) $(am__append_15) \
@@ -1791,7 +1775,7 @@ src_libdrivers_la_SOURCES = src/drivers.
 	$(am__append_73) $(am__append_74) $(am__append_75) \
 	$(am__append_76) $(am__append_77)
 libsigrok_la_LIBADD = src/libdrivers.lo $(SR_EXTRA_LIBS) $(LIBSIGROK_LIBS)
-libsigrok_la_LDFLAGS = -version-info $(SR_LIB_VERSION) -no-undefined
+libsigrok_la_LDFLAGS = -version-info $(SR_LIB_VERSION) -no-undefined -Wc,-T -Wc,src/libdrivers.ld
 library_includedir = $(includedir)/libsigrok
 library_include_HEADERS = \
 	include/libsigrok/libsigrok.h \
@@ -3028,16 +3012,6 @@ src/hardware/zketech-ebd-usb/api.lo:  \
 
 src/libdrivers.la: $(src_libdrivers_la_OBJECTS) $(src_libdrivers_la_DEPENDENCIES) $(EXTRA_src_libdrivers_la_DEPENDENCIES) src/$(am__dirstamp)
 	$(AM_V_CCLD)$(LINK)  $(src_libdrivers_la_OBJECTS) $(src_libdrivers_la_LIBADD) $(LIBS)
-src/driver_list_start.lo: src/$(am__dirstamp) \
-	src/$(DEPDIR)/$(am__dirstamp)
-
-src/libdrivers_head.la: $(src_libdrivers_head_la_OBJECTS) $(src_libdrivers_head_la_DEPENDENCIES) $(EXTRA_src_libdrivers_head_la_DEPENDENCIES) src/$(am__dirstamp)
-	$(AM_V_CCLD)$(LINK)  $(src_libdrivers_head_la_OBJECTS) $(src_libdrivers_head_la_LIBADD) $(LIBS)
-src/driver_list_stop.lo: src/$(am__dirstamp) \
-	src/$(DEPDIR)/$(am__dirstamp)
-
-src/libdrivers_tail.la: $(src_libdrivers_tail_la_OBJECTS) $(src_libdrivers_tail_la_DEPENDENCIES) $(EXTRA_src_libdrivers_tail_la_DEPENDENCIES) src/$(am__dirstamp)
-	$(AM_V_CCLD)$(LINK)  $(src_libdrivers_tail_la_OBJECTS) $(src_libdrivers_tail_la_LIBADD) $(LIBS)
 tests/$(am__dirstamp):
 	@$(MKDIR_P) tests
 	@: > tests/$(am__dirstamp)
@@ -3241,8 +3215,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/backend.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/conversion.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/device.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/driver_list_start.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/driver_list_stop.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/drivers.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/error.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/ezusb.Plo@am__quote@ # am--include-marker
@@ -4387,8 +4359,6 @@ distclean: distclean-am
 	-rm -f src/$(DEPDIR)/backend.Plo
 	-rm -f src/$(DEPDIR)/conversion.Plo
 	-rm -f src/$(DEPDIR)/device.Plo
-	-rm -f src/$(DEPDIR)/driver_list_start.Plo
-	-rm -f src/$(DEPDIR)/driver_list_stop.Plo
 	-rm -f src/$(DEPDIR)/drivers.Plo
 	-rm -f src/$(DEPDIR)/error.Plo
 	-rm -f src/$(DEPDIR)/ezusb.Plo
@@ -4674,8 +4644,6 @@ maintainer-clean: maintainer-clean-am
 	-rm -f src/$(DEPDIR)/backend.Plo
 	-rm -f src/$(DEPDIR)/conversion.Plo
 	-rm -f src/$(DEPDIR)/device.Plo
-	-rm -f src/$(DEPDIR)/driver_list_start.Plo
-	-rm -f src/$(DEPDIR)/driver_list_stop.Plo
 	-rm -f src/$(DEPDIR)/drivers.Plo
 	-rm -f src/$(DEPDIR)/error.Plo
 	-rm -f src/$(DEPDIR)/ezusb.Plo
@@ -4968,10 +4936,8 @@ uninstall-am: uninstall-bindings_cxx_lib
 .PRECIOUS: Makefile
 
 
-src/libdrivers.o: src/libdrivers.la \
-		src/libdrivers_head.la src/libdrivers_tail.la
-	$(AM_V_CCLD)$(LINK) src/libdrivers_head.la src/libdrivers.la \
-		src/libdrivers_tail.la
+src/libdrivers.o: src/libdrivers.la
+	$(AM_V_CCLD)$(LINK) src/libdrivers.la
 src/libdrivers.lo: src/libdrivers.o
 	$(AM_V_GEN)echo "# Generated by libtool" > $@
 	$(AM_V_at)echo "pic_object='libdrivers.o'" >> $@
--- a/src/driver_list_start.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * This file is part of the libsigrok project.
- *
- * Copyright (C) 2017 Marcus Comstedt <marcus@mc.pp.se>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <config.h>
-#include <glib.h>
-#include <libsigrok/libsigrok.h>
-#include "libsigrok-internal.h"
-
-/*
- * This marks the start of the driver list. This file must be linked
- * before any actual drivers.
- */
-
-SR_PRIV const struct sr_dev_driver *sr_driver_list__start[]
-	__attribute__((section (SR_DRIVER_LIST_SECTION),
-		       used, aligned(sizeof(struct sr_dev_driver *))))
-  = { NULL /* Dummy item, as zero length arrays are not allowed by C99 */ };
--- a/src/driver_list_stop.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * This file is part of the libsigrok project.
- *
- * Copyright (C) 2017 Marcus Comstedt <marcus@mc.pp.se>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <config.h>
-#include <glib.h>
-#include <libsigrok/libsigrok.h>
-#include "libsigrok-internal.h"
-
-/*
- * This marks the end of the driver list. This file must be linked
- * after any actual drivers.
- */
-
-SR_PRIV const struct sr_dev_driver *sr_driver_list__stop[]
-	__attribute__((section (SR_DRIVER_LIST_SECTION),
-		       used, aligned(sizeof(struct sr_dev_driver *))))
-  = { NULL /* Dummy item, as zero length arrays are not allowed by C99 */ };
--- a/src/drivers.c
+++ b/src/drivers.c
@@ -45,7 +45,7 @@ SR_API void sr_drivers_init(struct sr_co
 
 	array = g_array_new(TRUE, FALSE, sizeof(struct sr_dev_driver *));
 #ifdef HAVE_DRIVERS
-	for (const struct sr_dev_driver **drivers = sr_driver_list__start + 1;
+	for (const struct sr_dev_driver **drivers = sr_driver_list__start;
 	     drivers < sr_driver_list__stop; drivers++)
 		g_array_append_val(array, *drivers);
 #endif
--- /dev/null
+++ b/src/libdrivers.ld
@@ -0,0 +1,9 @@
+SECTIONS
+{
+	__sr_driver_list : {
+		sr_driver_list__start = .;
+		*(__sr_driver_list)
+		sr_driver_list__stop = .;
+	}
+}
+INSERT AFTER .data;
openSUSE Build Service is sponsored by