pmdk icon indicating copy to clipboard operation
pmdk copied to clipboard

LTO breaks the build

Open cpaelzer opened this issue 3 years ago • 1 comments

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

cpaelzer avatar Mar 30 '21 13:03 cpaelzer

@kmalek-int, do we have any update on this?

lukaszstolarczuk avatar May 18 '21 14:05 lukaszstolarczuk

Add disable lto to cflags: https://github.com/pmem/pmdk/pull/5252

wlemkows avatar Apr 03 '23 11:04 wlemkows

That is is not fix. It is JFDI solution.

kloczek avatar Apr 03 '23 11:04 kloczek

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

lukaszstolarczuk avatar Apr 03 '23 12:04 lukaszstolarczuk

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.

pbalcer avatar Apr 03 '23 13:04 pbalcer

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.

kloczek avatar Apr 03 '23 15:04 kloczek

This improvement is not considered vital at the moment. So, we do not have the resources to fulfil your request. Sorry.

janekmi avatar Aug 30 '23 18:08 janekmi