[PKG-IRC-Maintainers] Bug#641299: inspircd: FTBFS with ld that defaults to --as-needed: bad link order

Colin Watson cjwatson at ubuntu.com
Mon Sep 12 13:15:14 UTC 2011


Package: inspircd
Version: 1.1.22+dfsg-4
Severity: important
Tags: patch
User: ubuntu-devel at lists.ubuntu.com
Usertags: origin-ubuntu ubuntu-patch oneiric

inspircd fails to build with a linker that defaults to --as-needed, as
shown in this Ubuntu bug report:

  https://bugs.launchpad.net/ubuntu/+source/inspircd/+bug/770747

This is because of incorrect link ordering: it puts libraries before the
objects that use them rather than after.  See:

  http://wiki.debian.org/ToolChain/DSOLinking#Only_link_with_needed_libraries

The following patch fixes this.

  * Fix link order to list libraries after the objects that require them.

diff -u inspircd-1.1.22+dfsg/debian/patches/00list inspircd-1.1.22+dfsg/debian/patches/00list
--- inspircd-1.1.22+dfsg/debian/patches/00list
+++ inspircd-1.1.22+dfsg/debian/patches/00list
@@ -4,0 +5 @@
+05_link_order.dpatch
only in patch2:
unchanged:
--- inspircd-1.1.22+dfsg.orig/debian/patches/05_link_order.dpatch
+++ inspircd-1.1.22+dfsg/debian/patches/05_link_order.dpatch
@@ -0,0 +1,37 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 04_link_order.dpatch by Colin Watson <cjwatson at ubuntu.com>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Fix link order to list libraries after the objects that require them.
+
+ at DPATCH@
+diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' inspircd-1.1.22+dfsg~/configure inspircd-1.1.22+dfsg/configure
+--- inspircd-1.1.22+dfsg~/configure	2011-09-12 14:01:26.000000000 +0100
++++ inspircd-1.1.22+dfsg/configure	2011-09-12 14:02:31.000000000 +0100
+@@ -1605,7 +1605,7 @@
+ all: timer.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o configreader.o inspsocket.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o snomasks.o \$(MODULES) inspircd.exe
+ 
+ inspircd.exe: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h ../include/base.h
+-	\$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe \$(LDLIBS) channels.o mode.o xline.o inspstring.o dns.o base.o inspsocket.o configreader.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o timer.o snomasks.o modes/modeclasses.a \$(MODULES)
++	\$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe channels.o mode.o xline.o inspstring.o dns.o base.o inspsocket.o configreader.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o timer.o snomasks.o modes/modeclasses.a \$(MODULES) \$(LDLIBS)
+ EOM
+ 	}
+ 
+@@ -1750,7 +1750,7 @@
+ 
+ inspircd: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h ../include/socket.h $cmdobjs libIRCDtimer.dylib libIRCDcull_list.dylib libIRCDuserprocess.dylib libIRCDsocketengine.dylib libIRCDsocket.dylib libIRCDhash.dylib libIRCDchannels.dylib libIRCDmode.dylib libIRCDxline.dylib libIRCDstring.dylib libIRCDasyncdns.dylib libIRCDbase.dylib libIRCDconfigreader.dylib libIRCDinspsocket.dylib libIRCDsnomasks.dylib libIRCDcommands.dylib libIRCDdynamic.dylib libIRCDusers.dylib libIRCDmodules.dylib libIRCDwildcard.dylib libIRCDhelper.dylib libIRCDcommand_parse.dylib
+ 	\$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd.cpp
+-	\$(CC) -pipe -dynamic -bind_at_load -L. -o inspircd \$(LDLIBS) inspircd.o libIRCDchannels.dylib libIRCDmode.dylib libIRCDxline.dylib libIRCDstring.dylib libIRCDasyncdns.dylib libIRCDbase.dylib libIRCDconfigreader.dylib libIRCDinspsocket.dylib libIRCDcommands.dylib libIRCDdynamic.dylib libIRCDusers.dylib libIRCDmodules.dylib libIRCDwildcard.dylib libIRCDhelper.dylib libIRCDhash.dylib libIRCDsocket.dylib libIRCDsocketengine.dylib libIRCDuserprocess.dylib libIRCDcull_list.dylib libIRCDcommand_parse.dylib libIRCDtimer.dylib libIRCDsnomasks.dylib
++	\$(CC) -pipe -dynamic -bind_at_load -L. -o inspircd inspircd.o libIRCDchannels.dylib libIRCDmode.dylib libIRCDxline.dylib libIRCDstring.dylib libIRCDasyncdns.dylib libIRCDbase.dylib libIRCDconfigreader.dylib libIRCDinspsocket.dylib libIRCDcommands.dylib libIRCDdynamic.dylib libIRCDusers.dylib libIRCDmodules.dylib libIRCDwildcard.dylib libIRCDhelper.dylib libIRCDhash.dylib libIRCDsocket.dylib libIRCDsocketengine.dylib libIRCDuserprocess.dylib libIRCDcull_list.dylib libIRCDcommand_parse.dylib libIRCDtimer.dylib libIRCDsnomasks.dylib \$(LDLIBS)
+ 
+ libIRCDsocketengine.dylib: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h
+ 	\$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
+@@ -1860,7 +1860,7 @@
+ 
+ inspircd: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h ../include/socket.h libIRCDtimer.o libIRCDcull_list.o libIRCDuserprocess.o libIRCDsocketengine.o libIRCDsocket.o libIRCDhash.o libIRCDchannels.o libIRCDmode.o libIRCDxline.o libIRCDstring.o libIRCDasyncdns.o libIRCDbase.o libIRCDconfigreader.o libIRCDinspsocket.o $cmdobjs libIRCDsnomasks.o libIRCDcommands.o libIRCDdynamic.o libIRCDusers.o libIRCDmodules.o libIRCDwildcard.o libIRCDhelper.o libIRCDcommand_parse.o socketengine.o
+ 	\${MAKE} -C "modes" DIRNAME="src/modes" CC="\$(CC)" \$(MAKEARGS) CPPFILES="\$(CPPFILES)"
+-	\$(CC) -pipe -I../include $extra $RPATH \$(FLAGS) $freebsd4libs -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) libIRCDchannels.o libIRCDmode.o libIRCDxline.o libIRCDstring.o libIRCDasyncdns.o libIRCDbase.o libIRCDconfigreader.o libIRCDinspsocket.o libIRCDcommands.o libIRCDdynamic.o libIRCDusers.o libIRCDmodules.o libIRCDwildcard.o libIRCDhelper.o libIRCDhash.o libIRCDsocket.o libIRCDsocketengine.o libIRCDuserprocess.o libIRCDcull_list.o libIRCDcommand_parse.o libIRCDtimer.o libIRCDsnomasks.o socketengine.o modes/modeclasses.a
++	\$(CC) -pipe -I../include $extra $RPATH \$(FLAGS) $freebsd4libs -rdynamic -L. inspircd.cpp -o inspircd libIRCDchannels.o libIRCDmode.o libIRCDxline.o libIRCDstring.o libIRCDasyncdns.o libIRCDbase.o libIRCDconfigreader.o libIRCDinspsocket.o libIRCDcommands.o libIRCDdynamic.o libIRCDusers.o libIRCDmodules.o libIRCDwildcard.o libIRCDhelper.o libIRCDhash.o libIRCDsocket.o libIRCDsocketengine.o libIRCDuserprocess.o libIRCDcull_list.o libIRCDcommand_parse.o libIRCDtimer.o libIRCDsnomasks.o socketengine.o modes/modeclasses.a \$(LDLIBS)
+ 
+ socketengine.o: $se.cpp ../include/$se.h
+ 	\$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c -o \$@ $se.cpp

Thanks,

-- 
Colin Watson                                       [cjwatson at ubuntu.com]





More information about the Pkg-irc-maintainers mailing list