kdave / btrfs-progs

Development of userspace BTRFS tools
GNU General Public License v2.0
527 stars 239 forks source link

autoconf: clang build on aarch64 fails (it tries to build with x86 features) #712

Closed vadorovsky closed 7 months ago

vadorovsky commented 7 months ago

Building btrfs-progs with clang and lld (16) fails with the following linker errors:

    [LD]     mkfs.btrfs
    [LD]     btrfs-map-logical
    [LD]     btrfs-image
    [LD]     btrfs-find-root
clang -o mkfs.btrfs mkfs/main.o mkfs/common.o mkfs/rootdir.o kernel-lib/list_sort.o kernel-lib/raid56.o kernel-lib/rbtree.o kernel-lib/tables.o kernel-shared/accessors.o kernel-shared/async-thread.o kernel-shared/backref.o kernel-shared/ctree.o kernel-shared/delayed-ref.o kernel-shared/dir-item.o kernel-shared/disk-io.o kernel-shared/extent-io-tree.o kernel-shared/extent-tree.o kernel-shared/extent_io.o kernel-shared/file-item.o kernel-shared/file.o kernel-shared/free-space-cache.o kernel-shared/free-space-tree.o kernel-shared/inode-item.o kernel-shared/inode.o kernel-shared/locking.o kernel-shared/messages.o kernel-shared/print-tree.o kernel-shared/root-tree.o kernel-shared/transaction.o kernel-shared/tree-checker.o kernel-shared/ulist.o kernel-shared/uuid-tree.o kernel-shared/volumes.o kernel-shared/zoned.o common/array.o common/cpu-utils.o common/device-scan.o common/device-utils.o common/extent-cache.o common/extent-tree-utils.o common/filesystem-utils.o common/format-output.o common/fsfeatures.o common/help.o common/inject-error.o common/messages.o common/open-utils.o common/parse-utils.o common/path-utils.o common/rbtree-utils.o common/send-stream.o common/send-utils.o common/sort-utils.o common/string-table.o common/string-utils.o common/sysfs-utils.o common/task-utils.o common/units.o common/utils.o check/qgroup-verify.o check/repair.o cmds/receive-dump.o crypto/crc32c.o crypto/hash.o crypto/xxhash.o crypto/sha224-256.o crypto/blake2b-ref.o crypto/blake2b-sse2.o crypto/blake2b-sse41.o crypto/blake2b-avx2.o crypto/sha256-x86.o libbtrfsutil/stubs.o libbtrfsutil/subvolume.o libbtrfsutil.a -Wl,-O1 -Wl,--as-needed -Wl,--as-needed -rdynamic -L.   -luuid  -lblkid   -L. -pthread 
ld.lld: error: undefined symbol: blake2b_compress_sse2
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)

ld.lld: error: undefined symbol: blake2b_compress_avx2
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)

ld.lld: error: undefined symbol: blake2b_compress_sse41
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)

ld.lld: error: undefined symbol: sha256_process_x86
>>> referenced by sha224-256.c
>>>               crypto/sha224-256.o:(sha256_process_x86_dispatch)
clang-16: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Makefile:715: mkfs.btrfs] Error 1
make: *** Waiting for unfinished jobs....
clang -O2 -pipe -march=native -std=gnu11 -include include/config.h -DBTRFS_FLAT_INCLUDES -D_XOPEN_SOURCE=700 -fno-strict-aliasing -fPIC -Wall -Wunused-but-set-parameter -I. -I./include -DCRYPTOPROVIDER_BUILTIN=1 -DCOMPRESSION_LZO=1 -DCOMPRESSION_ZSTD=1  -Wno-address-of-packed-member  -Wimplicit-fallthrough  -Wmissing-prototypes -Wshadow    -c libbtrfs/send-utils.c -o libbtrfs/send-utils.o  \

clang -o btrfs-map-logical kernel-lib/list_sort.o kernel-lib/raid56.o kernel-lib/rbtree.o kernel-lib/tables.o kernel-shared/accessors.o kernel-shared/async-thread.o kernel-shared/backref.o kernel-shared/ctree.o kernel-shared/delayed-ref.o kernel-shared/dir-item.o kernel-shared/disk-io.o kernel-shared/extent-io-tree.o kernel-shared/extent-tree.o kernel-shared/extent_io.o kernel-shared/file-item.o kernel-shared/file.o kernel-shared/free-space-cache.o kernel-shared/free-space-tree.o kernel-shared/inode-item.o kernel-shared/inode.o kernel-shared/locking.o kernel-shared/messages.o kernel-shared/print-tree.o kernel-shared/root-tree.o kernel-shared/transaction.o kernel-shared/tree-checker.o kernel-shared/ulist.o kernel-shared/uuid-tree.o kernel-shared/volumes.o kernel-shared/zoned.o common/array.o common/cpu-utils.o common/device-scan.o common/device-utils.o common/extent-cache.o common/extent-tree-utils.o common/filesystem-utils.o common/format-output.o common/fsfeatures.o common/help.o common/inject-error.o common/messages.o common/open-utils.o common/parse-utils.o common/path-utils.o common/rbtree-utils.o common/send-stream.o common/send-utils.o common/sort-utils.o common/string-table.o common/string-utils.o common/sysfs-utils.o common/task-utils.o common/units.o common/utils.o check/qgroup-verify.o check/repair.o cmds/receive-dump.o crypto/crc32c.o crypto/hash.o crypto/xxhash.o crypto/sha224-256.o crypto/blake2b-ref.o crypto/blake2b-sse2.o crypto/blake2b-sse41.o crypto/blake2b-avx2.o crypto/sha256-x86.o libbtrfsutil/stubs.o libbtrfsutil/subvolume.o btrfs-map-logical.o \
     \
    libbtrfsutil.a \
    -Wl,-O1 -Wl,--as-needed -Wl,--as-needed -rdynamic -L.   -luuid  -lblkid   -L. -pthread  
ld.lld: error: undefined symbol: blake2b_compress_sse2
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)

ld.lld: error: undefined symbol: blake2b_compress_avx2
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)

ld.lld: error: undefined symbol: blake2b_compress_sse41
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)

ld.lld: error: undefined symbol: sha256_process_x86
>>> referenced by sha224-256.c
>>>               crypto/sha224-256.o:(sha256_process_x86_dispatch)
clang-16: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Makefile:672: btrfs-map-logical] Error 1
clang -o btrfs-find-root kernel-lib/list_sort.o kernel-lib/raid56.o kernel-lib/rbtree.o kernel-lib/tables.o kernel-shared/accessors.o kernel-shared/async-thread.o kernel-shared/backref.o kernel-shared/ctree.o kernel-shared/delayed-ref.o kernel-shared/dir-item.o kernel-shared/disk-io.o kernel-shared/extent-io-tree.o kernel-shared/extent-tree.o kernel-shared/extent_io.o kernel-shared/file-item.o kernel-shared/file.o kernel-shared/free-space-cache.o kernel-shared/free-space-tree.o kernel-shared/inode-item.o kernel-shared/inode.o kernel-shared/locking.o kernel-shared/messages.o kernel-shared/print-tree.o kernel-shared/root-tree.o kernel-shared/transaction.o kernel-shared/tree-checker.o kernel-shared/ulist.o kernel-shared/uuid-tree.o kernel-shared/volumes.o kernel-shared/zoned.o common/array.o common/cpu-utils.o common/device-scan.o common/device-utils.o common/extent-cache.o common/extent-tree-utils.o common/filesystem-utils.o common/format-output.o common/fsfeatures.o common/help.o common/inject-error.o common/messages.o common/open-utils.o common/parse-utils.o common/path-utils.o common/rbtree-utils.o common/send-stream.o common/send-utils.o common/sort-utils.o common/string-table.o common/string-utils.o common/sysfs-utils.o common/task-utils.o common/units.o common/utils.o check/qgroup-verify.o check/repair.o cmds/receive-dump.o crypto/crc32c.o crypto/hash.o crypto/xxhash.o crypto/sha224-256.o crypto/blake2b-ref.o crypto/blake2b-sse2.o crypto/blake2b-sse41.o crypto/blake2b-avx2.o crypto/sha256-x86.o libbtrfsutil/stubs.o libbtrfsutil/subvolume.o btrfs-find-root.o \
     \
    libbtrfsutil.a \
    -Wl,-O1 -Wl,--as-needed -Wl,--as-needed -rdynamic -L.   -luuid  -lblkid   -L. -pthread  
ld.lld: error: undefined symbol: blake2b_compress_sse2
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)

ld.lld: error: undefined symbol: blake2b_compress_avx2
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)

ld.lld: error: undefined symbol: blake2b_compress_sse41
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)

ld.lld: error: undefined symbol: sha256_process_x86
>>> referenced by sha224-256.c
>>>               crypto/sha224-256.o:(sha256_process_x86_dispatch)
clang-16: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Makefile:672: btrfs-find-root] Error 1
clang -o btrfs-image image/main.o image/sanitize.o image/image-create.o image/common.o image/image-restore.o kernel-lib/list_sort.o kernel-lib/raid56.o kernel-lib/rbtree.o kernel-lib/tables.o kernel-shared/accessors.o kernel-shared/async-thread.o kernel-shared/backref.o kernel-shared/ctree.o kernel-shared/delayed-ref.o kernel-shared/dir-item.o kernel-shared/disk-io.o kernel-shared/extent-io-tree.o kernel-shared/extent-tree.o kernel-shared/extent_io.o kernel-shared/file-item.o kernel-shared/file.o kernel-shared/free-space-cache.o kernel-shared/free-space-tree.o kernel-shared/inode-item.o kernel-shared/inode.o kernel-shared/locking.o kernel-shared/messages.o kernel-shared/print-tree.o kernel-shared/root-tree.o kernel-shared/transaction.o kernel-shared/tree-checker.o kernel-shared/ulist.o kernel-shared/uuid-tree.o kernel-shared/volumes.o kernel-shared/zoned.o common/array.o common/cpu-utils.o common/device-scan.o common/device-utils.o common/extent-cache.o common/extent-tree-utils.o common/filesystem-utils.o common/format-output.o common/fsfeatures.o common/help.o common/inject-error.o common/messages.o common/open-utils.o common/parse-utils.o common/path-utils.o common/rbtree-utils.o common/send-stream.o common/send-utils.o common/sort-utils.o common/string-table.o common/string-utils.o common/sysfs-utils.o common/task-utils.o common/units.o common/utils.o check/qgroup-verify.o check/repair.o cmds/receive-dump.o crypto/crc32c.o crypto/hash.o crypto/xxhash.o crypto/sha224-256.o crypto/blake2b-ref.o crypto/blake2b-sse2.o crypto/blake2b-sse41.o crypto/blake2b-avx2.o crypto/sha256-x86.o libbtrfsutil/stubs.o libbtrfsutil/subvolume.o libbtrfsutil.a -Wl,-O1 -Wl,--as-needed -Wl,--as-needed -rdynamic -L.   -luuid  -lblkid   -L. -pthread  -lz  -llzo2 -lzstd 
ld.lld: error: undefined symbol: sha256_process_x86
>>> referenced by sha224-256.c
>>>               crypto/sha224-256.o:(sha256_process_x86_dispatch)

ld.lld: error: undefined symbol: blake2b_compress_sse2
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)

ld.lld: error: undefined symbol: blake2b_compress_avx2
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)

ld.lld: error: undefined symbol: blake2b_compress_sse41
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)
>>> referenced by blake2b-ref.c
>>>               crypto/blake2b-ref.o:(blake2_init_accel)
clang-16: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Makefile:731: btrfs-image] Error 1
clang -O2 -pipe -march=native -std=gnu11 -include include/config.h -DBTRFS_FLAT_INCLUDES -D_XOPEN_SOURCE=700 -fno-strict-aliasing -fPIC -Wall -Wunused-but-set-parameter -I. -I./include -DCRYPTOPROVIDER_BUILTIN=1 -DCOMPRESSION_LZO=1 -DCOMPRESSION_ZSTD=1  -Wno-address-of-packed-member  -Wimplicit-fallthrough  -Wmissing-prototypes -Wshadow    -c btrfs-corrupt-block.c -o btrfs-corrupt-block.o  \

clang -O2 -pipe -march=native -std=gnu11 -include include/config.h -DBTRFS_FLAT_INCLUDES -D_XOPEN_SOURCE=700 -fno-strict-aliasing -fPIC -Wall -Wunused-but-set-parameter -I. -I./include -DCRYPTOPROVIDER_BUILTIN=1 -DCOMPRESSION_LZO=1 -DCOMPRESSION_ZSTD=1  -Wno-address-of-packed-member  -Wimplicit-fallthrough  -Wmissing-prototypes -Wshadow    -c check/main.c -o check/main.o  \

That's because the following checks:

https://github.com/kdave/btrfs-progs/blob/afa23d4e279ad24027269d6ca5309f894e6daa87/configure.ac#L48-L62

are insufficient for clang. Clang, unlike GCC, typically accepts unknown or unsupported -m options without error, simple ignoring them if they don't apply to the target architecture.

gnustomp commented 7 months ago

It looks like clang will start to reject these x86-specific flags when building for other architectures in a future release. https://github.com/llvm/llvm-project/issues/64632

kdave commented 7 months ago

I've made the -m flags conditional for x86_64, so this should fix compilation on aarch64 but I haven't verified that yet.

kdave commented 7 months ago

Verified in OBS, aarch64 builds.

gnustomp commented 7 months ago

@kdave, I think the patch unintentionally disables SSE2/etc. for x86_64 targets as well. Did you intend to use the following?

if test "x$target_cpu" == 'xx86_64'; then
kdave commented 7 months ago

Ah right, thanks. The "x$variable" is the most backward compatible test that's recommended for configure but apparently it's easy to make a typo. Fixed in devel.