pmdk
pmdk copied to clipboard
LTO breaks the build
ISSUE: Compiling with LTO breaks pmdk build
Environment Information
- PMDK package version(s): 1.10
- OS(es) version(s): Ubuntu 21.04
- ndctl version(s): 71.1-1
- kernel version(s): 5.11.0-11.12
- compiler, libraries, packaging and other related tools version(s): 10.2.1-23ubuntu2
Please provide a reproduction of the bug:
Build pmdk in Ubuntu 21.04 with LTO enabled (the new default) if built via the packaging. There are many ways, but the simplest might be: $ pull-lp-source pmdk 1.10-1 $ apt build-dep pmdk $ cd pmdk_1.10-1 $ ./debian/rules build
How often bug is revealed: always
Actual behavior:
Breaks on build - full log
Around the fail it looks like:
ld -o ../nondebug/libpmempool/libpmempool_unscoped.o -r ../nondebug/libpmempool/alloc.o ../nondebug/libpmempool/fs_posix.o ../nondebug/libpmempool/os_posix.o ../nondebug/libpmempool/os_thread_posix.o ../nondebug/libpmempool/out.o ../nondebug/libpmempool/util.o ../nondebug/libpmempool/util_posix.o ../nondebug/libpmempool/bad_blocks.o ../nondebug/libpmempool/set_badblocks.o ../nondebug/libpmempool/ctl.o ../nondebug/libpmempool/ctl_prefault.o ../nondebug/libpmempool/ctl_sds.o ../nondebug/libpmempool/ctl_fallocate.o ../nondebug/libpmempool/ctl_cow.o ../nondebug/libpmempool/file.o ../nondebug/libpmempool/file_posix.o ../nondebug/libpmempool/mmap.o ../nondebug/libpmempool/mmap_posix.o ../nondebug/libpmempool/os_deep_linux.o ../nondebug/libpmempool/pool_hdr.o ../nondebug/libpmempool/rand.o ../nondebug/libpmempool/ravl.o ../nondebug/libpmempool/set.o ../nondebug/libpmempool/shutdown_state.o ../nondebug/libpmempool/uuid.o ../nondebug/libpmempool/uuid_linux.o ../nondebug/libpmempool/pmem2_utils.o ../nondebug/libpmempool/config.o ../nondebug/libpmempool/persist_posix.o ../nondebug/libpmempool/badblocks.o ../nondebug/libpmempool/badblocks_ndctl.o ../nondebug/libpmempool/usc_ndctl.o ../nondebug/libpmempool/source.o ../nondebug/libpmempool/source_posix.o ../nondebug/libpmempool/auto_flush_linux.o ../nondebug/libpmempool/deep_flush_linux.o ../nondebug/libpmempool/extent_linux.o ../nondebug/libpmempool/pmem2_utils_linux.o ../nondebug/libpmempool/pmem2_utils_ndctl.o ../nondebug/libpmempool/region_namespace_ndctl.o ../nondebug/libpmempool/libpmempool.o ../nondebug/libpmempool/check.o ../nondebug/libpmempool/check_bad_blocks.o ../nondebug/libpmempool/check_backup.o ../nondebug/libpmempool/check_btt_info.o ../nondebug/libpmempool/check_btt_map_flog.o ../nondebug/libpmempool/check_log.o ../nondebug/libpmempool/check_blk.o ../nondebug/libpmempool/check_pool_hdr.o ../nondebug/libpmempool/check_sds.o ../nondebug/libpmempool/check_util.o ../nondebug/libpmempool/check_write.o ../nondebug/libpmempool/pool.o ../nondebug/libpmempool/replica.o ../nondebug/libpmempool/feature.o ../nondebug/libpmempool/rpmem_common.o ../nondebug/libpmempool/rpmem_ssh.o ../nondebug/libpmempool/rpmem_cmd.o ../nondebug/libpmempool/rpmem_util.o ../nondebug/libpmempool/sync.o ../nondebug/libpmempool/transform.o ../nondebug/libpmempool/rm.o pmemblk_priv_funcs.o
cc -Wl,-Bsymbolic-functions -flto=auto -Wl,-z,relro -Wl,-z,now -Wl,-z,relro -Wl,--fatal-warnings -Wl,--warn-common -L../nondebug/libpmempool/.. -shared -Wl,--version-script=libpmempool.link,-soname,libpmempool.so.1 -o ../nondebug/libpmempool/../libpmempool.so.1.0.0 ../nondebug/libpmempool/alloc.o ../nondebug/libpmempool/fs_posix.o ../nondebug/libpmempool/os_posix.o ../nondebug/libpmempool/os_thread_posix.o ../nondebug/libpmempool/out.o ../nondebug/libpmempool/util.o ../nondebug/libpmempool/util_posix.o ../nondebug/libpmempool/bad_blocks.o ../nondebug/libpmempool/set_badblocks.o ../nondebug/libpmempool/ctl.o ../nondebug/libpmempool/ctl_prefault.o ../nondebug/libpmempool/ctl_sds.o ../nondebug/libpmempool/ctl_fallocate.o ../nondebug/libpmempool/ctl_cow.o ../nondebug/libpmempool/file.o ../nondebug/libpmempool/file_posix.o ../nondebug/libpmempool/mmap.o ../nondebug/libpmempool/mmap_posix.o ../nondebug/libpmempool/os_deep_linux.o ../nondebug/libpmempool/pool_hdr.o ../nondebug/libpmempool/rand.o ../nondebug/libpmempool/ravl.o ../nondebug/libpmempool/set.o ../nondebug/libpmempool/shutdown_state.o ../nondebug/libpmempool/uuid.o ../nondebug/libpmempool/uuid_linux.o ../nondebug/libpmempool/pmem2_utils.o ../nondebug/libpmempool/config.o ../nondebug/libpmempool/persist_posix.o ../nondebug/libpmempool/badblocks.o ../nondebug/libpmempool/badblocks_ndctl.o ../nondebug/libpmempool/usc_ndctl.o ../nondebug/libpmempool/source.o ../nondebug/libpmempool/source_posix.o ../nondebug/libpmempool/auto_flush_linux.o ../nondebug/libpmempool/deep_flush_linux.o ../nondebug/libpmempool/extent_linux.o ../nondebug/libpmempool/pmem2_utils_linux.o ../nondebug/libpmempool/pmem2_utils_ndctl.o ../nondebug/libpmempool/region_namespace_ndctl.o ../nondebug/libpmempool/libpmempool.o ../nondebug/libpmempool/check.o ../nondebug/libpmempool/check_bad_blocks.o ../nondebug/libpmempool/check_backup.o ../nondebug/libpmempool/check_btt_info.o ../nondebug/libpmempool/check_btt_map_flog.o ../nondebug/libpmempool/check_log.o ../nondebug/libpmempool/check_blk.o ../nondebug/libpmempool/check_pool_hdr.o ../nondebug/libpmempool/check_sds.o ../nondebug/libpmempool/check_util.o ../nondebug/libpmempool/check_write.o ../nondebug/libpmempool/pool.o ../nondebug/libpmempool/replica.o ../nondebug/libpmempool/feature.o ../nondebug/libpmempool/rpmem_common.o ../nondebug/libpmempool/rpmem_ssh.o ../nondebug/libpmempool/rpmem_cmd.o ../nondebug/libpmempool/rpmem_util.o ../nondebug/libpmempool/sync.o ../nondebug/libpmempool/transform.o ../nondebug/libpmempool/rm.o pmemblk_priv_funcs.o -pthread -lpmem -ldl -lndctl -ldaxctl
/usr/bin/ld: pmemblk_priv_funcs.o (symbol from plugin): in function `_Malloc':
(.text+0x0): multiple definition of `_Malloc'; ../nondebug/libpmempool/alloc.o (symbol from plugin):(.text+0x0): first defined here
/usr/bin/ld: pmemblk_priv_funcs.o (symbol from plugin): in function `_Malloc':
...
/usr/bin/ld: pmemblk_priv_funcs.o (symbol from plugin): in function `_Malloc':
(.text+0x0): multiple definition of `pmem2_auto_flush'; ../nondebug/libpmempool/auto_flush_linux.o (symbol from plugin):(.text+0x0): first defined here
/usr/bin/ld: pmemblk_priv_funcs.o (symbol from plugin): in function `_Malloc':
(.text+0x0): multiple definition of `pmem2_deep_flush_dax'; ../nondebug/libpmempool/deep_flush_linux.o (symbol from plugin):(.text+0x0): first defined here
objcopy --localize-hidden `sed -n 's/^ *\([a-zA-Z0-9_]*\);$/-G \1/p' libpmempool.link` ../nondebug/libpmempool/libpmempool_unscoped.o ../nondebug/libpmempool/libpmempool_all.o
ar rv ../nondebug/libpmempool/../libpmempool.a ../nondebug/libpmempool/libpmempool_all.o
ar: creating ../nondebug/libpmempool/../libpmempool.a
a - ../nondebug/libpmempool/libpmempool_all.o
collect2: error: ld returned 1 exit status
make[4]: *** [../Makefile.inc:242: ../nondebug/libpmempool/../libpmempool.so.1.0.0] Error 1
make[4]: Leaving directory '/<<PKGBUILDDIR>>/src/libpmempool'
make[3]: *** [Makefile:140: libpmempool] Error 2
make[3]: Leaving directory '/<<PKGBUILDDIR>>/src'
make[2]: *** [Makefile:55: all] Error 2
make[2]: Leaving directory '/<<PKGBUILDDIR>>'
dh_auto_build: error: make -j4 "INSTALL=install --strip-program=true" prefix=/usr libdir=/usr/lib/x86_64-linux-gnu sysconfdir=/etc bashcompdir=/usr/share/bash-completion/completions NORPATH=1 BUILD_EXAMPLES=n BUILD_BENCHMARKS=n returned exit code 2
make[1]: *** [debian/rules:19: override_dh_auto_build] Error 25
make[1]: Leaving directory '/<<PKGBUILDDIR>>'
make: *** [debian/rules:11: binary] Error 2
Expected behavior:
Still building correctly
Details
This came up when Ubuntu started to switch on LTO by default, see here
Additional information about Priority and Help Requested:
Requested priority: Medium
@kmalek-int, do we have any update on this?
Add disable lto to cflags: https://github.com/pmem/pmdk/pull/5252
That is is not fix. It is JFDI solution.
Hi @kloczek, I'm not sure if you're aware, but we're winding down the investment in PMDK development. Please see our blog post for more details.
Due to low resources available and other priorities, we had to prepare a workaround linked above.
If this issue is of high value to you, you can always submit a pull request with a patch. You can also share your use case of PMDK if you feel like it.
Thanks, Luke
Just to be clear, it's not that we don't want to fix it properly. But it's not that simple, and we really tried. PMDK's build system is just very complicated, and, e.g., uses objcpy
that's difficult to eliminate. Our solution was to rewrite the build system (#5507). That's not possible right now for the reason that @lukaszstolarczuk mentioned.
As would bother you about pmdk
as it is about subsystem which is no lponmger supported by new hardware however still ir is not possible to build ceph without pmdk
.
This improvement is not considered vital at the moment. So, we do not have the resources to fulfil your request. Sorry.