[FFmpeg-devel] libavfilter fails to link on x86_64

Paul Flinders paul
Sun Dec 5 21:13:26 CET 2010

On 12/05/2010 06:33 PM, Paul Flinders wrote:
> The recent SSE2/SSSE3 optimisations to yadif have resulted in a 
> failure to compile on x86_64 with the error message
> /usr/bin/ld: libavfilter/x86/yadif.o: relocation R_X86_64_PC32 against 
> undefined symbol `ff_pw_1' can not be used when making a shared 
> object; recompile with -fPIC
> /usr/bin/ld: final link failed: Bad value
Sorry to reply to my own post...

OK, as I understand it this error is caused by trying to access a symbol 
which is defined in another DSO from position independent 64bit code 
because the range of PC relative addressing isn't sufficient to reach an 
arbitrary 64bit address.

Until the recent patches the code defined its own versions of the 
constants pw_1 and pb_1, the new code removed these definitions and uses 
ff_pw_1 and ff_pb_1 presumably intending to pick up the versions in 
libavcodec. The relevant headers aren't included though which makes it 
less than 100% clear that was the intention (there are no compile time 
errors as they are only referenced from assembler statements).

The following patch fixes the compile, not sure whether it is the 
approach you would want to take.

--- libavfilter/x86/yadif.c~    2010-12-05 16:33:02.000000000 +0000
+++ libavfilter/x86/yadif.c    2010-12-05 19:14:49.000000000 +0000
@@ -22,6 +22,11 @@
  #include "libavutil/x86_cpu.h"
  #include "libavfilter/yadif.h"

+#include "libavcodec/x86/dsputil_mmx.h"
+DECLARE_ALIGNED(16, const xmm_reg,  ff_pw_1  ) = 
{0x0001000100010001ULL, 0x0001000100010001ULL};
+DECLARE_ALIGNED(16, const xmm_reg,  ff_pb_1  ) = 
{0x0101010101010101ULL, 0x0101010101010101ULL};
  #if HAVE_SSSE3

More information about the ffmpeg-devel mailing list