llvm-mingw icon indicating copy to clipboard operation
llvm-mingw copied to clipboard

libvfw32.a missing in ARM toolchains

Open qyot27 opened this issue 3 years ago • 8 comments

In trying to build AviSynth+ with the aarch64-w64-mingw32 toolchain, it can't link to libvfw32 because it wasn't built for either of the ARM toolchains. llvm-mingw built using ./build-all.sh, Ubuntu 22.04 host.

$ ninja
[2/2] Linking CXX shared library avs_core/AviSynth.dll
FAILED: avs_core/AviSynth.dll avs_core/AviSynth.dll.a 
: && /usr/llvm-mingw/bin/aarch64-w64-mingw32-g++   -Wl,--enable-stdcall-fixup  ../../avs_core/core/avisynth64.def -shared -o avs_core/AviSynth.dll -Wl,--out-implib,avs_core/AviSynth.dll.a -Wl,--major-image-version,0,--minor-image-version,0 avs_core/CMakeFiles/AvsCore.dir/convert/convert.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_audio.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_audio_c.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_bits.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_helper.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_matrix.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_planar.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_rgb.cpp.obj avs_core/CMakeFiles/AvsCore.dir/convert/convert_yuy2.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/AviHelper.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/BufferPool.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/DeviceManager.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/FilterConstructor.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/FilterGraph.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/MTGuard.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/PluginManager.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/Prefetcher.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/ThreadPool.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/alignplanar.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/audio.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/avisynth.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/avisynth_c.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/bitblt.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/cache.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/cpuid.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/exception.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/fonts/fixedfonts.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/info.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/initguid.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/interface.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/main.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/memcpy_amd.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/parser/expression.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/parser/script.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/parser/scriptparser.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/parser/tokenizer.cpp.obj avs_core/CMakeFiles/AvsCore.dir/core/strings.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/color.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/combine.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/conditional/conditional.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/conditional/conditional_functions.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/conditional/conditional_reader.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/convolution.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/debug.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/edit.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/exprfilter/exprfilter.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/field.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/focus.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/fps.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/greyscale.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/histogram.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/layer.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/levels.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/limiter.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/merge.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/misc.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/444convert.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_add.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_blend.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_darken.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_difference.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_exclusion.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_lighten.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_lumachroma.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_multiply.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_softhardlight.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/OF_subtract.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/blend_common.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/overlay/overlay.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/planeswap.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/resample.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/resample_functions.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/resize.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/source.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/text-overlay.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/transform.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/turn.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/AVIIndex.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/AVIReadHandler.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/AudioSource.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/DubSource.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/FastReadStream.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/File64.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/VD_Audio.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/avi_source.cpp.obj avs_core/CMakeFiles/AvsCore.dir/filters/AviSource/list.cpp.obj  -luuid  -lwinmm  -lvfw32  -lmsacm32  -lgdi32  -luser32  -ladvapi32  -lole32  -limagehlp  -lpthread  -lc++ && :
lld: error: unable to find library -lvfw32
clang-14: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

Obviously, in 2022 I doubt anyone is seriously using Video for Windows, and there's even less chance of VfW codecs being ported to Windows on ARM, but MSVC cross-compiles that target aarch64 build without error.

libvfw32.a is there for both i686-w64-mingw32 and x86_64-w64-mingw32, and absent for both armv7-w64-mingw32 and aarch64-w64-mingw32.

qyot27 avatar May 25 '22 23:05 qyot27

Can you provide the repository link? It'll help to ensure that the new import library is correct.

Biswa96 avatar May 26 '22 03:05 Biswa96

I have sent a patch in upstream mingw-w64 here https://sourceforge.net/p/mingw-w64/mailman/message/37658583/. The crt has to be rebuilt for testing.

Biswa96 avatar May 26 '22 06:05 Biswa96

Rebuilt llvm-mingw from a fresh clone, patch was applied through invoking git am with the above patch in build-mingw-w64.sh and then running build-all.sh as before. It was still only built for i686 and amd64, not the arm toolchains, as verified by find . | grep <library-name>. I checked mingw-w64-crt/libarm{32|64}/Makefile.am and both of those had avifil32, avicap32, and msvfw32 added to lists of libraries, so the patch was applied correctly, but still didn't build them.

qyot27 avatar May 26 '22 10:05 qyot27

After applying patches on mingw-w64, you need to run autoreconf in mingw-w64-crt.

Note that those dlls actually seem to be missing on 32 bit arm (but they exist on 64 bit arm). So even if you manage to link a binary, it wouldn’t load on 32 bit arm.

mstorsjo avatar May 26 '22 10:05 mstorsjo

The new patch can be found here https://sourceforge.net/p/mingw-w64/mailman/message/37658696/. Martin is right. Those DLLs are not present in SysArm32 directory, neither in WinRT system images. But at first, I noticed those import libraries in Windows SDK.

Biswa96 avatar May 26 '22 12:05 Biswa96

I pushed that patch now, thanks!

FWIW, for similar cases in the future, you don't need to rebuild all of the toolchain just to get a missing import library. You can just run aarch64-w64-mingw32-dlltool -d path/to/avicap32.def -l toolchain/aarch64-w64-mingw32/lib/libavicap32.a. (However, as the libvfw32.a library is a merged version of three other ones, doing that requires running the .mri script for merging, e.g. cd toolchain/aarch64-w64-mingw32/lib; aarch64-w64-mingw32-ar -M < path/to/vfw32.mri.)

mstorsjo avatar May 26 '22 21:05 mstorsjo

After applying patches on mingw-w64, you need to run autoreconf in mingw-w64-crt.

Ah, yeah. I guess I assumed that since it was cloned from git, autoreconf-ing happened somewhere in the build script. But I also just forgot to do that.

Note that those dlls actually seem to be missing on 32 bit arm (but they exist on 64 bit arm). So even if you manage to link a binary, it wouldn’t load on 32 bit arm.

At least for AviSynth+, armv7 on Windows won't really be considered a supported combination, so that's not as critically important in that particular circumstance. Are some of the Microsoft ARM devices actually only 32-bit? I could understand if someone was trying to run it on a Raspberry Pi 2 or 3, but I figure most users tinkering around with Windows on ARM are going to be using a more powerful device capable of properly handling the aarch64 version (especially going forward from now, with there being motivation to actually compete with the M1).

qyot27 avatar May 26 '22 21:05 qyot27

At least for AviSynth+, armv7 on Windows won't really be considered a supported combination, so that's not as critically important in that particular circumstance. Are some of the Microsoft ARM devices actually only 32-bit? I could understand if someone was trying to run it on a Raspberry Pi 2 or 3, but I figure most users tinkering around with Windows on ARM are going to be using a more powerful device capable of properly handling the aarch64 version (especially going forward from now, with there being motivation to actually compete with the M1).

Actual real users to worry about, no.

The original Microsoft Surface RT was 32 bit, and I've been in contact with a user who runs full unlocked desktop stuff on such a device (iirc with Windows 10 too). But that's not a properly supported platform but just a custom hack.

And I've got other users who build stuff for Win10 IoT, which iirc is 32 bit only, but that's probably not a relevant target here either.

mstorsjo avatar May 26 '22 21:05 mstorsjo