PR #22649 opened by Kacper Michajłow (kasper93)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22649
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22649.patch

In cases when preprocesor would remove all code, nasm would produce
empty object files. This is technically not wrong, but often cause
issues with various tooling:

* NASM fails to emit CodeView debug info when there is no code [1]
* Older VS2022 builds hangs on empty files [2]
* binutils strip errors when there is no sections [3]
error: the input file '.o' has no sections

[1] https://github.com/netwide-assembler/nasm/issues/216
[2] 
https://developercommunity.visualstudio.com/t/MSVC-Hangs-when-compiling-ffmpeg-When-l/10233953
[3] https://trac.ffmpeg.org/ticket/6711


From b750313b52d32bff58eb113e3c516a4d75d59550 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= <[email protected]>
Date: Sat, 28 Mar 2026 01:20:49 +0100
Subject: [PATCH] Makefile: don't produce empty object files
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

In cases when preprocesor would remove all code, nasm would produce
empty object files. This is technically not wrong, but often cause
issues with various tooling:

* NASM fails to emit CodeView debug info when there is no code [1]
* Older VS2022 builds hangs on empty files [2]
* binutils strip errors when there is no sections [3]
error: the input file '.o' has no sections

[1] https://github.com/netwide-assembler/nasm/issues/216
[2] 
https://developercommunity.visualstudio.com/t/MSVC-Hangs-when-compiling-ffmpeg-When-l/10233953
[3] https://trac.ffmpeg.org/ticket/6711

Signed-off-by: Kacper Michajłow <[email protected]>
---
 Makefile                    |  5 ++++-
 ffbuild/arch.mak            |  8 ++++++++
 libavcodec/x86/Makefile     | 27 +++++++++++--------------
 libavcodec/x86/vvc/Makefile |  2 +-
 libavfilter/x86/Makefile    | 40 ++++++++++++++++++++-----------------
 libavutil/x86/Makefile      |  3 ++-
 libswscale/x86/Makefile     |  3 ++-
 7 files changed, 51 insertions(+), 37 deletions(-)

diff --git a/Makefile b/Makefile
index f296e87ed4..9b5b5b1eda 100644
--- a/Makefile
+++ b/Makefile
@@ -109,7 +109,10 @@ ffbuild/.config: $(CONFIGURABLE_COMPONENTS)
 SUBDIR_VARS := CLEANFILES FFLIBS HOSTPROGS TESTPROGS TOOLS               \
                HEADERS ARCH_HEADERS BUILT_HEADERS SKIPHEADERS            \
                ARMV5TE-OBJS ARMV6-OBJS ARMV8-OBJS VFP-OBJS NEON-OBJS     \
-               ALTIVEC-OBJS VSX-OBJS X86ASM-OBJS                         \
+               ALTIVEC-OBJS VSX-OBJS                                     \
+               X86ASM-OBJS X86ASM_X64-OBJS X86ASM_X32-OBJS               \
+               X86ASM_AVX2-OBJS X86ASM_SSSE3-OBJS X86ASM_AESNI-OBJS      \
+               X86ASM_X64_AVX2-OBJS X86ASM_X64_AVX512ICL-OBJS            \
                MIPSFPU-OBJS MIPSDSPR2-OBJS MIPSDSP-OBJS MSA-OBJS         \
                MMI-OBJS LSX-OBJS LASX-OBJS RV-OBJS RVV-OBJS RVVB-OBJS    \
                OBJS SHLIBOBJS STLIBOBJS HOSTOBJS TESTOBJS SIMD128-OBJS   \
diff --git a/ffbuild/arch.mak b/ffbuild/arch.mak
index 13e1eb33bc..f7445d808a 100644
--- a/ffbuild/arch.mak
+++ b/ffbuild/arch.mak
@@ -25,4 +25,12 @@ OBJS-$(HAVE_RV_ZVBB) += $(RVVB-OBJS)    $(RVVB-OBJS-yes)
 
 OBJS-$(HAVE_SIMD128) += $(SIMD128-OBJS) $(SIMD128-OBJS-yes)
 
+X86ASM_X64-OBJS-$(HAVE_AVX2_EXTERNAL)      += $(X86ASM_X64_AVX2-OBJS)      
$(X86ASM_X64_AVX2-OBJS-yes)
+X86ASM_X64-OBJS-$(HAVE_AVX512ICL_EXTERNAL) += $(X86ASM_X64_AVX512ICL-OBJS) 
$(X86ASM_X64_AVX512ICL-OBJS-yes)
+X86ASM-OBJS-$(ARCH_X86_64)                 += $(X86ASM_X64-OBJS)           
$(X86ASM_X64-OBJS-yes)
+X86ASM-OBJS-$(ARCH_X86_32)                 += $(X86ASM_X32-OBJS)           
$(X86ASM_X32-OBJS-yes)
+X86ASM-OBJS-$(HAVE_AVX2_EXTERNAL)          += $(X86ASM_AVX2-OBJS)          
$(X86ASM_AVX2-OBJS-yes)
+X86ASM-OBJS-$(HAVE_SSSE3_EXTERNAL)         += $(X86ASM_SSSE3-OBJS)         
$(X86ASM_SSSE3-OBJS-yes)
+X86ASM-OBJS-$(HAVE_AESNI_EXTERNAL)         += $(X86ASM_AESNI-OBJS)         
$(X86ASM_AESNI-OBJS-yes)
+
 OBJS-$(HAVE_X86ASM)  += $(X86ASM-OBJS)  $(X86ASM-OBJS-yes)
diff --git a/libavcodec/x86/Makefile b/libavcodec/x86/Makefile
index bf723ed1a6..ea0ff2245e 100644
--- a/libavcodec/x86/Makefile
+++ b/libavcodec/x86/Makefile
@@ -126,11 +126,8 @@ X86ASM-OBJS-$(CONFIG_QPELDSP)          += x86/qpeldsp.o    
             \
 X86ASM-OBJS-$(CONFIG_RV34DSP)          += x86/rv34dsp.o
 X86ASM-OBJS-$(CONFIG_VC1DSP)           += x86/vc1dsp_loopfilter.o       \
                                           x86/vc1dsp_mc.o x86/fpel.o
-ifdef ARCH_X86_64
-X86ASM-OBJS-$(CONFIG_IDCTDSP)          += x86/simple_idct10.o
-else
-X86ASM-OBJS-$(CONFIG_IDCTDSP)          += x86/simple_idct.o
-endif
+X86ASM_X64-OBJS-$(CONFIG_IDCTDSP)      += x86/simple_idct10.o
+X86ASM_X32-OBJS-$(CONFIG_IDCTDSP)      += x86/simple_idct.o
 X86ASM-OBJS-$(CONFIG_VIDEODSP)         += x86/videodsp.o
 X86ASM-OBJS-$(CONFIG_VP3DSP)           += x86/vp3dsp.o
 X86ASM-OBJS-$(CONFIG_VP8DSP)           += x86/vp8dsp.o                  \
@@ -144,9 +141,9 @@ X86ASM-OBJS-$(CONFIG_ADPCM_G722_DECODER) += x86/g722dsp.o
 X86ASM-OBJS-$(CONFIG_ADPCM_G722_ENCODER) += x86/g722dsp.o
 X86ASM-OBJS-$(CONFIG_ALAC_DECODER)     += x86/alacdsp.o
 X86ASM-OBJS-$(CONFIG_APNG_DECODER)     += x86/pngdsp.o
-X86ASM-OBJS-$(CONFIG_APV_DECODER)      += x86/apv_dsp.o
+X86ASM_X64-OBJS-$(CONFIG_APV_DECODER)  += x86/apv_dsp.o
 X86ASM-OBJS-$(CONFIG_CAVS_DECODER)     += x86/cavsidct.o x86/cavs_qpel.o
-X86ASM-OBJS-$(CONFIG_CFHD_ENCODER)     += x86/cfhdencdsp.o
+X86ASM_X64-OBJS-$(CONFIG_CFHD_ENCODER) += x86/cfhdencdsp.o
 X86ASM-OBJS-$(CONFIG_CFHD_DECODER)     += x86/cfhddsp.o
 X86ASM-OBJS-$(CONFIG_DCA_DECODER)      += x86/dcadsp.o x86/synth_filter.o
 X86ASM-OBJS-$(CONFIG_DIRAC_DECODER)    += x86/diracdsp.o                \
@@ -159,31 +156,31 @@ X86ASM-OBJS-$(CONFIG_FLAC_ENCODER)     += 
x86/flac_dsp_gpl.o
 endif
 X86ASM-OBJS-$(CONFIG_JPEG2000_DECODER) += x86/jpeg2000dsp.o
 X86ASM-OBJS-$(CONFIG_LSCR_DECODER)     += x86/pngdsp.o
-X86ASM-OBJS-$(CONFIG_MLP_DECODER)      += x86/mlpdsp.o
+X86ASM_X64-OBJS-$(CONFIG_MLP_DECODER)  += x86/mlpdsp.o
 X86ASM-OBJS-$(CONFIG_MPEG4_DECODER)    += x86/xvididct.o
 X86ASM-OBJS-$(CONFIG_PNG_DECODER)      += x86/pngdsp.o
-X86ASM-OBJS-$(CONFIG_PRORES_DECODER)   += x86/proresdsp.o
-X86ASM-OBJS-$(CONFIG_PRORES_RAW_DECODER) += x86/proresdsp.o
+X86ASM_X64-OBJS-$(CONFIG_PRORES_DECODER)   += x86/proresdsp.o
+X86ASM_X64-OBJS-$(CONFIG_PRORES_RAW_DECODER) += x86/proresdsp.o
 X86ASM-OBJS-$(CONFIG_RV40_DECODER)     += x86/rv40dsp.o
 X86ASM-OBJS-$(CONFIG_SBC_ENCODER)      += x86/sbcdsp.o
 X86ASM-OBJS-$(CONFIG_SVQ1_ENCODER)     += x86/svq1enc.o
 X86ASM-OBJS-$(CONFIG_TAK_DECODER)      += x86/takdsp.o
-X86ASM-OBJS-$(CONFIG_TRUEHD_DECODER)   += x86/mlpdsp.o
+X86ASM_X64-OBJS-$(CONFIG_TRUEHD_DECODER) += x86/mlpdsp.o
 X86ASM-OBJS-$(CONFIG_TTA_DECODER)      += x86/ttadsp.o
 X86ASM-OBJS-$(CONFIG_TTA_ENCODER)      += x86/ttaencdsp.o
 X86ASM-OBJS-$(CONFIG_UTVIDEO_DECODER)  += x86/utvideodsp.o
-X86ASM-OBJS-$(CONFIG_V210_ENCODER)     += x86/v210enc.o
+X86ASM_SSSE3-OBJS-$(CONFIG_V210_ENCODER) += x86/v210enc.o
 X86ASM-OBJS-$(CONFIG_V210_DECODER)     += x86/v210.o
 X86ASM-OBJS-$(CONFIG_VORBIS_DECODER)   += x86/vorbisdsp.o
 X86ASM-OBJS-$(CONFIG_VP6_DECODER)      += x86/vp6dsp.o
 X86ASM-OBJS-$(CONFIG_VP9_DECODER)      += x86/vp9intrapred.o            \
                                           x86/vp9intrapred_16bpp.o      \
                                           x86/vp9itxfm.o                \
-                                          x86/vp9itxfm_avx2.o           \
-                                          x86/vp9itxfm_avx512.o         \
                                           x86/vp9itxfm_16bpp.o          \
-                                          x86/vp9itxfm_16bpp_avx512.o   \
                                           x86/vp9lpf.o                  \
                                           x86/vp9lpf_16bpp.o            \
                                           x86/vp9mc.o                   \
                                           x86/vp9mc_16bpp.o
+X86ASM_X64_AVX2-OBJS-$(CONFIG_VP9_DECODER)      += x86/vp9itxfm_avx2.o
+X86ASM_X64_AVX512ICL-OBJS-$(CONFIG_VP9_DECODER) += x86/vp9itxfm_avx512.o \
+                                                    x86/vp9itxfm_16bpp_avx512.o
diff --git a/libavcodec/x86/vvc/Makefile b/libavcodec/x86/vvc/Makefile
index 0cebfb4e9e..72e445d324 100644
--- a/libavcodec/x86/vvc/Makefile
+++ b/libavcodec/x86/vvc/Makefile
@@ -4,10 +4,10 @@ clean::
 X86ASM-OBJS-$(CONFIG_VVC_DECODER)      += x86/vvc/dsp_init.o        \
                                           x86/vvc/alf.o             \
                                           x86/vvc/dmvr.o            \
-                                          x86/vvc/mc.o              \
                                           x86/vvc/of.o              \
                                           x86/vvc/sad.o             \
                                           x86/vvc/sao.o             \
                                           x86/vvc/sao_10bit.o       \
                                           x86/h26x/h2656dsp.o       \
                                           x86/h26x/h2656_inter.o
+X86ASM_X64_AVX2-OBJS-$(CONFIG_VVC_DECODER) += x86/vvc/mc.o
diff --git a/libavfilter/x86/Makefile b/libavfilter/x86/Makefile
index ade0efc9ae..95dc72ea1c 100644
--- a/libavfilter/x86/Makefile
+++ b/libavfilter/x86/Makefile
@@ -5,19 +5,20 @@ X86ASM-OBJS-$(CONFIG_SCENE_SAD)              += 
x86/scene_sad.o x86/scene_sad_in
 
 X86ASM-OBJS-$(CONFIG_AFIR_FILTER)            += x86/af_afir.o 
x86/af_afir_init.o
 X86ASM-OBJS-$(CONFIG_ANLMDN_FILTER)          += x86/af_anlmdn.o 
x86/af_anlmdn_init.o
-X86ASM-OBJS-$(CONFIG_ATADENOISE_FILTER)      += x86/vf_atadenoise.o           \
-                                                x86/vf_atadenoise_init.o
-X86ASM-OBJS-$(CONFIG_BLACKDETECT_FILTER)     += x86/vf_blackdetect.o          \
-                                                x86/vf_blackdetect_init.o
+X86ASM_X64-OBJS-$(CONFIG_ATADENOISE_FILTER)  += x86/vf_atadenoise.o
+X86ASM-OBJS-$(CONFIG_ATADENOISE_FILTER)      += x86/vf_atadenoise_init.o
+X86ASM_AVX2-OBJS-$(CONFIG_BLACKDETECT_FILTER) += x86/vf_blackdetect.o
+X86ASM-OBJS-$(CONFIG_BLACKDETECT_FILTER)     += x86/vf_blackdetect_init.o
 X86ASM-OBJS-$(CONFIG_BLEND_FILTER)           += x86/vf_blend.o 
x86/vf_blend_init.o
 X86ASM-OBJS-$(CONFIG_BWDIF_FILTER)           += x86/vf_bwdif.o 
x86/vf_bwdif_init.o
-X86ASM-OBJS-$(CONFIG_COLORDETECT_FILTER)     += x86/vf_colordetect.o          \
-                                                x86/vf_colordetect_init.o
-X86ASM-OBJS-$(CONFIG_COLORSPACE_FILTER)      += x86/colorspacedsp.o           \
-                                                x86/colorspacedsp_init.o
-X86ASM-OBJS-$(CONFIG_CONVOLUTION_FILTER)     += x86/vf_convolution.o          \
-                                                x86/vf_convolution_init.o
-X86ASM-OBJS-$(CONFIG_EBUR128_FILTER)         += x86/f_ebur128.o 
x86/f_ebur128_init.o
+X86ASM_AVX2-OBJS-$(CONFIG_COLORDETECT_FILTER) += x86/vf_colordetect.o
+X86ASM-OBJS-$(CONFIG_COLORDETECT_FILTER)     += x86/vf_colordetect_init.o
+X86ASM_X64-OBJS-$(CONFIG_COLORSPACE_FILTER)  += x86/colorspacedsp.o
+X86ASM-OBJS-$(CONFIG_COLORSPACE_FILTER)      += x86/colorspacedsp_init.o
+X86ASM_X64-OBJS-$(CONFIG_CONVOLUTION_FILTER) += x86/vf_convolution.o
+X86ASM-OBJS-$(CONFIG_CONVOLUTION_FILTER)     += x86/vf_convolution_init.o
+X86ASM_X64-OBJS-$(CONFIG_EBUR128_FILTER)     += x86/f_ebur128.o
+X86ASM-OBJS-$(CONFIG_EBUR128_FILTER)         += x86/f_ebur128_init.o
 X86ASM-OBJS-$(CONFIG_EQ_FILTER)              += x86/vf_eq.o x86/vf_eq_init.o
 X86ASM-OBJS-$(CONFIG_FRAMERATE_FILTER)       += x86/vf_framerate.o            \
                                                 x86/vf_framerate_init.o
@@ -25,7 +26,8 @@ X86ASM-OBJS-$(CONFIG_FSPP_FILTER)            += x86/vf_fspp.o 
x86/vf_fspp_init.o
 X86ASM-OBJS-$(CONFIG_GBLUR_FILTER)           += x86/vf_gblur.o 
x86/vf_gblur_init.o
 X86ASM-OBJS-$(CONFIG_GRADFUN_FILTER)         += x86/vf_gradfun.o              \
                                                 x86/vf_gradfun_init.o
-X86ASM-OBJS-$(CONFIG_HALDCLUT_FILTER)        += x86/vf_lut3d.o 
x86/vf_lut3d_init.o
+X86ASM_X64-OBJS-$(CONFIG_HALDCLUT_FILTER)    += x86/vf_lut3d.o
+X86ASM-OBJS-$(CONFIG_HALDCLUT_FILTER)        += x86/vf_lut3d_init.o
 X86ASM-OBJS-$(CONFIG_HFLIP_FILTER)           += x86/vf_hflip.o 
x86/vf_hflip_init.o
 X86ASM-OBJS-$(CONFIG_HQDN3D_FILTER)          += x86/vf_hqdn3d.o 
x86/vf_hqdn3d_init.o
 X86ASM-OBJS-$(CONFIG_IDET_FILTER)            += x86/vf_idetdsp.o              \
@@ -34,13 +36,14 @@ X86ASM-OBJS-$(CONFIG_INTERLACE_FILTER)       += 
x86/vf_interlace.o            \
                                                 x86/vf_tinterlace_init.o
 X86ASM-OBJS-$(CONFIG_LIMITER_FILTER)         += x86/vf_limiter.o              \
                                                 x86/vf_limiter_init.o
-X86ASM-OBJS-$(CONFIG_LUT3D_FILTER)           += x86/vf_lut3d.o 
x86/vf_lut3d_init.o
+X86ASM_X64-OBJS-$(CONFIG_LUT3D_FILTER)       += x86/vf_lut3d.o
+X86ASM-OBJS-$(CONFIG_LUT3D_FILTER)           += x86/vf_lut3d_init.o
 X86ASM-OBJS-$(CONFIG_MASKEDCLAMP_FILTER)     += x86/vf_maskedclamp.o          \
                                                 x86/vf_maskedclamp_init.o
 X86ASM-OBJS-$(CONFIG_MASKEDMERGE_FILTER)     += x86/vf_maskedmerge.o          \
                                                 x86/vf_maskedmerge_init.o
-X86ASM-OBJS-$(CONFIG_NLMEANS_FILTER)         += x86/vf_nlmeans.o              \
-                                                x86/vf_nlmeans_init.o
+X86ASM_X64_AVX2-OBJS-$(CONFIG_NLMEANS_FILTER) += x86/vf_nlmeans.o
+X86ASM-OBJS-$(CONFIG_NLMEANS_FILTER)          += x86/vf_nlmeans_init.o
 X86ASM-OBJS-$(CONFIG_OVERLAY_FILTER)         += x86/vf_overlay.o              \
                                                 x86/vf_overlay_init.o
 X86ASM-OBJS-$(CONFIG_PP7_FILTER)             += x86/vf_pp7.o x86/vf_pp7_init.o
@@ -52,8 +55,8 @@ X86ASM-OBJS-$(CONFIG_REMOVEGRAIN_FILTER)     += 
x86/vf_removegrain.o          \
 endif
 X86ASM-OBJS-$(CONFIG_SHOWCQT_FILTER)         += x86/avf_showcqt.o             \
                                                 x86/avf_showcqt_init.o
-X86ASM-OBJS-$(CONFIG_SOBEL_FILTER)           += x86/vf_convolution.o          \
-                                                x86/vf_convolution_init.o
+X86ASM_X64-OBJS-$(CONFIG_SOBEL_FILTER)       += x86/vf_convolution.o
+X86ASM-OBJS-$(CONFIG_SOBEL_FILTER)           += x86/vf_convolution_init.o
 X86ASM-OBJS-$(CONFIG_SSIM_FILTER)            += x86/vf_ssim.o 
x86/vf_ssim_init.o
 X86ASM-OBJS-$(CONFIG_STEREO3D_FILTER)        += x86/vf_stereo3d.o             \
                                                 x86/vf_stereo3d_init.o
@@ -65,7 +68,8 @@ X86ASM-OBJS-$(CONFIG_TINTERLACE_FILTER)      += 
x86/vf_interlace.o            \
 X86ASM-OBJS-$(CONFIG_TRANSPOSE_FILTER)       += x86/vf_transpose.o            \
                                                 x86/vf_transpose_init.o
 X86ASM-OBJS-$(CONFIG_VOLUME_FILTER)          += x86/af_volume.o 
x86/af_volume_init.o
-X86ASM-OBJS-$(CONFIG_V360_FILTER)            += x86/vf_v360.o 
x86/vf_v360_init.o
+X86ASM_AVX2-OBJS-$(CONFIG_V360_FILTER)       += x86/vf_v360.o
+X86ASM-OBJS-$(CONFIG_V360_FILTER)            += x86/vf_v360_init.o
 X86ASM-OBJS-$(CONFIG_W3FDIF_FILTER)          += x86/vf_w3fdif.o 
x86/vf_w3fdif_init.o
 X86ASM-OBJS-$(CONFIG_XPSNR_FILTER)           += x86/vf_psnr.o 
x86/vf_psnr_init.o
 X86ASM-OBJS-$(CONFIG_YADIF_FILTER)           += x86/vf_yadif.o x86/yadif-16.o \
diff --git a/libavutil/x86/Makefile b/libavutil/x86/Makefile
index bc3c63fe78..7fdd6e8893 100644
--- a/libavutil/x86/Makefile
+++ b/libavutil/x86/Makefile
@@ -2,7 +2,8 @@ OBJS += x86/cpu.o                                               
        \
 
 EMMS_OBJS_$(HAVE_MMX_INLINE)_$(HAVE_MMX_EXTERNAL)_$(HAVE_MM_EMPTY) = x86/emms.o
 
-X86ASM-OBJS += x86/aes.o x86/aes_init.o                                 \
+X86ASM_AESNI-OBJS += x86/aes.o
+X86ASM-OBJS += x86/aes_init.o                                          \
                x86/cpuid.o                                              \
                x86/crc.o                                                \
                $(EMMS_OBJS__yes_)                                       \
diff --git a/libswscale/x86/Makefile b/libswscale/x86/Makefile
index a6aa89e21a..54f6a5bcac 100644
--- a/libswscale/x86/Makefile
+++ b/libswscale/x86/Makefile
@@ -9,12 +9,13 @@ OBJS-$(CONFIG_XMM_CLOBBER_TEST) += x86/w64xmmtest.o
 X86ASM-OBJS                     += x86/input.o                          \
                                    x86/output.o                         \
                                    x86/scale.o                          \
-                                   x86/scale_avx2.o                          \
                                    x86/range_convert.o                  \
                                    x86/rgb_2_rgb.o                      \
                                    x86/yuv_2_rgb.o                      \
                                    x86/yuv2yuvX.o                       \
 
+X86ASM_X64_AVX2-OBJS              += x86/scale_avx2.o
+
 ifdef ARCH_X86_64
 X86ASM-OBJS-$(CONFIG_UNSTABLE)  += x86/ops_int.o                        \
                                    x86/ops_float.o                      \
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to