Message ID | 20220108195739.1212901-1-tytso@mit.edu (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
Series | xfsprogs: fix static build problems caused by liburcu | expand |
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 >
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 --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
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(-)