diff mbox series

xfsprogs: fix static build problems caused by liburcu

Message ID 20220108195739.1212901-1-tytso@mit.edu (mailing list archive)
State Accepted
Headers show
Series xfsprogs: fix static build problems caused by liburcu | expand

Commit Message

Theodore Ts'o Jan. 8, 2022, 7:57 p.m. UTC
The liburcu library has a dependency on pthreads.  Hence, in order for
static builds of xfsprogs to work, $(LIBPTHREAD) needs to appear
*after* $(LUBURCU) in LLDLIBS.  Otherwise, static links of xfs_* will
fail due to undefined references of pthread_create, pthread_exit,
et. al.

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
---
 copy/Makefile      | 4 ++--
 db/Makefile        | 4 ++--
 growfs/Makefile    | 4 ++--
 logprint/Makefile  | 4 ++--
 mdrestore/Makefile | 3 +--
 mkfs/Makefile      | 4 ++--
 repair/Makefile    | 2 +-
 scrub/Makefile     | 4 ++--
 8 files changed, 14 insertions(+), 15 deletions(-)

Comments

Darrick J. Wong Jan. 8, 2022, 11:23 p.m. UTC | #1
On Sat, Jan 08, 2022 at 02:57:39PM -0500, Theodore Ts'o wrote:
> The liburcu library has a dependency on pthreads.  Hence, in order for
> static builds of xfsprogs to work, $(LIBPTHREAD) needs to appear
> *after* $(LUBURCU) in LLDLIBS.  Otherwise, static links of xfs_* will
> fail due to undefined references of pthread_create, pthread_exit,
> et. al.
> 
> Signed-off-by: Theodore Ts'o <tytso@mit.edu>

Ugh, I keep forgetting that ld wants library dependencies in reverse
order nowadays...

Reviewed-by: Darrick J. Wong <djwong@kernel.org>

--D

> ---
>  copy/Makefile      | 4 ++--
>  db/Makefile        | 4 ++--
>  growfs/Makefile    | 4 ++--
>  logprint/Makefile  | 4 ++--
>  mdrestore/Makefile | 3 +--
>  mkfs/Makefile      | 4 ++--
>  repair/Makefile    | 2 +-
>  scrub/Makefile     | 4 ++--
>  8 files changed, 14 insertions(+), 15 deletions(-)
> 
> diff --git a/copy/Makefile b/copy/Makefile
> index 1b00cd0d..55160f84 100644
> --- a/copy/Makefile
> +++ b/copy/Makefile
> @@ -9,8 +9,8 @@ LTCOMMAND = xfs_copy
>  CFILES = xfs_copy.c
>  HFILES = xfs_copy.h
>  
> -LLDLIBS = $(LIBXFS) $(LIBXLOG) $(LIBFROG) $(LIBUUID) $(LIBPTHREAD) $(LIBRT) \
> -	  $(LIBURCU)
> +LLDLIBS = $(LIBXFS) $(LIBXLOG) $(LIBFROG) $(LIBUUID) $(LIBRT) $(LIBURCU) \
> +	  $(LIBPTHREAD)
>  LTDEPENDENCIES = $(LIBXFS) $(LIBXLOG) $(LIBFROG)
>  LLDFLAGS = -static-libtool-libs
>  
> diff --git a/db/Makefile b/db/Makefile
> index 5c017898..b2e01174 100644
> --- a/db/Makefile
> +++ b/db/Makefile
> @@ -18,8 +18,8 @@ CFILES = $(HFILES:.h=.c) btdump.c btheight.c convert.c info.c namei.c \
>  	timelimit.c
>  LSRCFILES = xfs_admin.sh xfs_ncheck.sh xfs_metadump.sh
>  
> -LLDLIBS	= $(LIBXFS) $(LIBXLOG) $(LIBFROG) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) \
> -	  $(LIBURCU)
> +LLDLIBS	= $(LIBXFS) $(LIBXLOG) $(LIBFROG) $(LIBUUID) $(LIBRT) $(LIBURCU) \
> +	  $(LIBPTHREAD)
>  LTDEPENDENCIES = $(LIBXFS) $(LIBXLOG) $(LIBFROG)
>  LLDFLAGS += -static-libtool-libs
>  
> diff --git a/growfs/Makefile b/growfs/Makefile
> index 08601de7..2f4cc66a 100644
> --- a/growfs/Makefile
> +++ b/growfs/Makefile
> @@ -9,8 +9,8 @@ LTCOMMAND = xfs_growfs
>  
>  CFILES = xfs_growfs.c
>  
> -LLDLIBS = $(LIBXFS) $(LIBXCMD) $(LIBFROG) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) \
> -	  $(LIBURCU)
> +LLDLIBS = $(LIBXFS) $(LIBXCMD) $(LIBFROG) $(LIBUUID) $(LIBRT) $(LIBURCU) \
> +	  $(LIBPTHREAD)
>  
>  ifeq ($(ENABLE_EDITLINE),yes)
>  LLDLIBS += $(LIBEDITLINE) $(LIBTERMCAP)
> diff --git a/logprint/Makefile b/logprint/Makefile
> index cdedbd0d..bbbed5d2 100644
> --- a/logprint/Makefile
> +++ b/logprint/Makefile
> @@ -12,8 +12,8 @@ CFILES = logprint.c \
>  	 log_copy.c log_dump.c log_misc.c \
>  	 log_print_all.c log_print_trans.c log_redo.c
>  
> -LLDLIBS	= $(LIBXFS) $(LIBXLOG) $(LIBFROG) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) \
> -	  $(LIBURCU)
> +LLDLIBS	= $(LIBXFS) $(LIBXLOG) $(LIBFROG) $(LIBUUID) $(LIBRT) $(LIBURCU) \
> +	  $(LIBPTHREAD)
>  LTDEPENDENCIES = $(LIBXFS) $(LIBXLOG) $(LIBFROG)
>  LLDFLAGS = -static-libtool-libs
>  
> diff --git a/mdrestore/Makefile b/mdrestore/Makefile
> index 8f28ddab..4a932efb 100644
> --- a/mdrestore/Makefile
> +++ b/mdrestore/Makefile
> @@ -8,8 +8,7 @@ include $(TOPDIR)/include/builddefs
>  LTCOMMAND = xfs_mdrestore
>  CFILES = xfs_mdrestore.c
>  
> -LLDLIBS = $(LIBXFS) $(LIBFROG) $(LIBRT) $(LIBPTHREAD) $(LIBUUID) \
> -	  $(LIBURCU)
> +LLDLIBS = $(LIBXFS) $(LIBFROG) $(LIBRT) $(LIBUUID) $(LIBURCU) $(LIBPTHREAD)
>  LTDEPENDENCIES = $(LIBXFS) $(LIBFROG)
>  LLDFLAGS = -static
>  
> diff --git a/mkfs/Makefile b/mkfs/Makefile
> index 811ba9db..9f6a4fad 100644
> --- a/mkfs/Makefile
> +++ b/mkfs/Makefile
> @@ -10,8 +10,8 @@ LTCOMMAND = mkfs.xfs
>  HFILES =
>  CFILES = proto.c xfs_mkfs.c
>  
> -LLDLIBS += $(LIBXFS) $(LIBXCMD) $(LIBFROG) $(LIBRT) $(LIBPTHREAD) $(LIBBLKID) \
> -	$(LIBUUID) $(LIBINIH) $(LIBURCU)
> +LLDLIBS += $(LIBXFS) $(LIBXCMD) $(LIBFROG) $(LIBRT) $(LIBBLKID) \
> +	$(LIBUUID) $(LIBINIH) $(LIBURCU) $(LIBPTHREAD)
>  LTDEPENDENCIES += $(LIBXFS) $(LIBXCMD) $(LIBFROG)
>  LLDFLAGS = -static-libtool-libs
>  
> diff --git a/repair/Makefile b/repair/Makefile
> index 47536ca1..2c40e59a 100644
> --- a/repair/Makefile
> +++ b/repair/Makefile
> @@ -72,7 +72,7 @@ CFILES = \
>  	xfs_repair.c
>  
>  LLDLIBS = $(LIBXFS) $(LIBXLOG) $(LIBXCMD) $(LIBFROG) $(LIBUUID) $(LIBRT) \
> -	$(LIBPTHREAD) $(LIBBLKID) $(LIBURCU)
> +	$(LIBBLKID) $(LIBURCU) $(LIBPTHREAD)
>  LTDEPENDENCIES = $(LIBXFS) $(LIBXLOG) $(LIBXCMD) $(LIBFROG)
>  LLDFLAGS = -static-libtool-libs
>  
> diff --git a/scrub/Makefile b/scrub/Makefile
> index 849e3afd..fd6bb679 100644
> --- a/scrub/Makefile
> +++ b/scrub/Makefile
> @@ -71,8 +71,8 @@ spacemap.c \
>  vfs.c \
>  xfs_scrub.c
>  
> -LLDLIBS += $(LIBHANDLE) $(LIBFROG) $(LIBPTHREAD) $(LIBICU_LIBS) $(LIBRT) \
> -	$(LIBURCU)
> +LLDLIBS += $(LIBHANDLE) $(LIBFROG) $(LIBICU_LIBS) $(LIBRT) $(LIBURCU) \
> +	$(LIBPTHREAD)
>  LTDEPENDENCIES += $(LIBHANDLE) $(LIBFROG)
>  LLDFLAGS = -static
>  
> -- 
> 2.31.0
>
Theodore Ts'o Jan. 9, 2022, 4:13 a.m. UTC | #2
On Sat, Jan 08, 2022 at 03:23:38PM -0800, Darrick J. Wong wrote:
> On Sat, Jan 08, 2022 at 02:57:39PM -0500, Theodore Ts'o wrote:
> > The liburcu library has a dependency on pthreads.  Hence, in order for
> > static builds of xfsprogs to work, $(LIBPTHREAD) needs to appear
> > *after* $(LUBURCU) in LLDLIBS.  Otherwise, static links of xfs_* will
> > fail due to undefined references of pthread_create, pthread_exit,
> > et. al.
> > 
> > Signed-off-by: Theodore Ts'o <tytso@mit.edu>
> 
> Ugh, I keep forgetting that ld wants library dependencies in reverse
> order nowadays...

Actually, for static linking this has always been the case.  For
example if foo_init() in libfoo calls bar_init() from libbar, you have
to specify the order as "-lfoo -lbar".  That's because the static
linker processes the libraries once, in command-line order.  So when
the program uses (and thus pulls in foo_init), the linker searches
-lfoo to find foo_init, and then looks at what symbols it needs, and
then will start searching the rest of the libraries to find bar_init,
which it will find only if -lbar is specified after -lfoo.

The problem is we've gotten spoiled by ELF shared libraries, where the
symbols are resolved as they are needed, so when main() calls
foo_init() at runtime, only then will the shared linker look for
bar_init(), which it will find regardless of wheter the libraries are
specified as "-lfoo -lbar" or "-lbar -lfoo".

So in general, libraries which are used by other libraries, but which
have no dependenciees of their own, should be listed last.  This
includes libraries such as -lpthread, -lsocket on Solaris, -lnsl (if
you use NIS/Yellow Pages), etc. --- but you'll only notice if you try
static linking.

Cheers,

					- Ted
diff mbox series

Patch

diff --git a/copy/Makefile b/copy/Makefile
index 1b00cd0d..55160f84 100644
--- a/copy/Makefile
+++ b/copy/Makefile
@@ -9,8 +9,8 @@  LTCOMMAND = xfs_copy
 CFILES = xfs_copy.c
 HFILES = xfs_copy.h
 
-LLDLIBS = $(LIBXFS) $(LIBXLOG) $(LIBFROG) $(LIBUUID) $(LIBPTHREAD) $(LIBRT) \
-	  $(LIBURCU)
+LLDLIBS = $(LIBXFS) $(LIBXLOG) $(LIBFROG) $(LIBUUID) $(LIBRT) $(LIBURCU) \
+	  $(LIBPTHREAD)
 LTDEPENDENCIES = $(LIBXFS) $(LIBXLOG) $(LIBFROG)
 LLDFLAGS = -static-libtool-libs
 
diff --git a/db/Makefile b/db/Makefile
index 5c017898..b2e01174 100644
--- a/db/Makefile
+++ b/db/Makefile
@@ -18,8 +18,8 @@  CFILES = $(HFILES:.h=.c) btdump.c btheight.c convert.c info.c namei.c \
 	timelimit.c
 LSRCFILES = xfs_admin.sh xfs_ncheck.sh xfs_metadump.sh
 
-LLDLIBS	= $(LIBXFS) $(LIBXLOG) $(LIBFROG) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) \
-	  $(LIBURCU)
+LLDLIBS	= $(LIBXFS) $(LIBXLOG) $(LIBFROG) $(LIBUUID) $(LIBRT) $(LIBURCU) \
+	  $(LIBPTHREAD)
 LTDEPENDENCIES = $(LIBXFS) $(LIBXLOG) $(LIBFROG)
 LLDFLAGS += -static-libtool-libs
 
diff --git a/growfs/Makefile b/growfs/Makefile
index 08601de7..2f4cc66a 100644
--- a/growfs/Makefile
+++ b/growfs/Makefile
@@ -9,8 +9,8 @@  LTCOMMAND = xfs_growfs
 
 CFILES = xfs_growfs.c
 
-LLDLIBS = $(LIBXFS) $(LIBXCMD) $(LIBFROG) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) \
-	  $(LIBURCU)
+LLDLIBS = $(LIBXFS) $(LIBXCMD) $(LIBFROG) $(LIBUUID) $(LIBRT) $(LIBURCU) \
+	  $(LIBPTHREAD)
 
 ifeq ($(ENABLE_EDITLINE),yes)
 LLDLIBS += $(LIBEDITLINE) $(LIBTERMCAP)
diff --git a/logprint/Makefile b/logprint/Makefile
index cdedbd0d..bbbed5d2 100644
--- a/logprint/Makefile
+++ b/logprint/Makefile
@@ -12,8 +12,8 @@  CFILES = logprint.c \
 	 log_copy.c log_dump.c log_misc.c \
 	 log_print_all.c log_print_trans.c log_redo.c
 
-LLDLIBS	= $(LIBXFS) $(LIBXLOG) $(LIBFROG) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) \
-	  $(LIBURCU)
+LLDLIBS	= $(LIBXFS) $(LIBXLOG) $(LIBFROG) $(LIBUUID) $(LIBRT) $(LIBURCU) \
+	  $(LIBPTHREAD)
 LTDEPENDENCIES = $(LIBXFS) $(LIBXLOG) $(LIBFROG)
 LLDFLAGS = -static-libtool-libs
 
diff --git a/mdrestore/Makefile b/mdrestore/Makefile
index 8f28ddab..4a932efb 100644
--- a/mdrestore/Makefile
+++ b/mdrestore/Makefile
@@ -8,8 +8,7 @@  include $(TOPDIR)/include/builddefs
 LTCOMMAND = xfs_mdrestore
 CFILES = xfs_mdrestore.c
 
-LLDLIBS = $(LIBXFS) $(LIBFROG) $(LIBRT) $(LIBPTHREAD) $(LIBUUID) \
-	  $(LIBURCU)
+LLDLIBS = $(LIBXFS) $(LIBFROG) $(LIBRT) $(LIBUUID) $(LIBURCU) $(LIBPTHREAD)
 LTDEPENDENCIES = $(LIBXFS) $(LIBFROG)
 LLDFLAGS = -static
 
diff --git a/mkfs/Makefile b/mkfs/Makefile
index 811ba9db..9f6a4fad 100644
--- a/mkfs/Makefile
+++ b/mkfs/Makefile
@@ -10,8 +10,8 @@  LTCOMMAND = mkfs.xfs
 HFILES =
 CFILES = proto.c xfs_mkfs.c
 
-LLDLIBS += $(LIBXFS) $(LIBXCMD) $(LIBFROG) $(LIBRT) $(LIBPTHREAD) $(LIBBLKID) \
-	$(LIBUUID) $(LIBINIH) $(LIBURCU)
+LLDLIBS += $(LIBXFS) $(LIBXCMD) $(LIBFROG) $(LIBRT) $(LIBBLKID) \
+	$(LIBUUID) $(LIBINIH) $(LIBURCU) $(LIBPTHREAD)
 LTDEPENDENCIES += $(LIBXFS) $(LIBXCMD) $(LIBFROG)
 LLDFLAGS = -static-libtool-libs
 
diff --git a/repair/Makefile b/repair/Makefile
index 47536ca1..2c40e59a 100644
--- a/repair/Makefile
+++ b/repair/Makefile
@@ -72,7 +72,7 @@  CFILES = \
 	xfs_repair.c
 
 LLDLIBS = $(LIBXFS) $(LIBXLOG) $(LIBXCMD) $(LIBFROG) $(LIBUUID) $(LIBRT) \
-	$(LIBPTHREAD) $(LIBBLKID) $(LIBURCU)
+	$(LIBBLKID) $(LIBURCU) $(LIBPTHREAD)
 LTDEPENDENCIES = $(LIBXFS) $(LIBXLOG) $(LIBXCMD) $(LIBFROG)
 LLDFLAGS = -static-libtool-libs
 
diff --git a/scrub/Makefile b/scrub/Makefile
index 849e3afd..fd6bb679 100644
--- a/scrub/Makefile
+++ b/scrub/Makefile
@@ -71,8 +71,8 @@  spacemap.c \
 vfs.c \
 xfs_scrub.c
 
-LLDLIBS += $(LIBHANDLE) $(LIBFROG) $(LIBPTHREAD) $(LIBICU_LIBS) $(LIBRT) \
-	$(LIBURCU)
+LLDLIBS += $(LIBHANDLE) $(LIBFROG) $(LIBICU_LIBS) $(LIBRT) $(LIBURCU) \
+	$(LIBPTHREAD)
 LTDEPENDENCIES += $(LIBHANDLE) $(LIBFROG)
 LLDFLAGS = -static