मैं बिना PIE के FFMPEG और लिबोम को कैसे संकलित करूं


3

मैं FFMPEG और लाइबॉम को स्रोत से संकलित करने का प्रयास कर रहा हूं क्योंकि डिफ़ॉल्ट रूप से Ubuntu 18.04 में gcc और g ++ कंपाइलरों ने डिफ़ॉल्ट रूप से निम्न विकल्प को सक्षम किया है: --enable-default-pie

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-16ubuntu3' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --with-as=/usr/bin/x86_64-linux-gnu-as --with-ld=/usr/bin/x86_64-linux-gnu-ld --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)

मैंने ए पास करने की कोशिश की है --extra-ldexeflags="-no-pie -fno-pic -fno-pie" लेकिन इससे कोई फायदा नहीं हुआ। लाइबॉम को संकलित करने की कोशिश करते समय मुझे यही समस्या है। मैंने gcc के पुराने संस्करण को स्थापित करने की कोशिश की है, लेकिन 5.X में भी यह है --enable-default-pie डिफ़ॉल्ट रूप से सक्षम विकल्प, इसलिए यह अच्छा नहीं है। स्पष्ट रूप से यह विकल्प उबंटू 18.04 पर मजबूर किया गया है और इसके आसपास कोई रास्ता नहीं है।

लाइबॉम को स्थापित करने का प्रयास करते समय मेरी त्रुटि है:

64%] Linking CXX executable examples/decode_with_drops
/usr/bin/x86_64-linux-gnu-ld: libaom.a(fwd_txfm_ssse3_x86_64.asm.o): relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/x86_64-linux-gnu-ld: libaom.a(quantize_ssse3_x86_64.asm.o): relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/x86_64-linux-gnu-ld: libaom.a(subpel_variance_sse2.asm.o): relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/x86_64-linux-gnu-ld: libaom.a(highbd_subpel_variance_impl_sse2.asm.o): relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/x86_64-linux-gnu-ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
CMakeFiles/decode_with_drops.dir/build.make:155: recipe for target 'examples/decode_with_drops' failed
make[2]: *** [examples/decode_with_drops] Error 1
CMakeFiles/Makefile2:936: recipe for target 'CMakeFiles/decode_with_drops.dir/all' failed
make[1]: *** [CMakeFiles/decode_with_drops.dir/all] Error 2
Makefile:129: recipe for target 'all' failed
make: *** [all] Error 2

[संपादित करें]: मेरी ffmpeg संकलन कमांड जोड़ना।

मैं उबंटू संकलन गाइड का पालन कर रहा था जो मेरी कमांड पर पोस्ट किया गया था, हालांकि थोड़ा अलग था। मैंने ffplay को अक्षम कर दिया है, क्योंकि मैं एक सर्वर पर ffmpeg स्थापित कर रहा हूं और libsrt (हाइविज़न सिक्योर विश्वसनीय ट्रांसपोर्ट प्रोटोकॉल) और लाइबॉम (AV1) को सक्षम किया है। मैंने नवीनतम रात के निर्माण के बजाय स्थिर 4.0 संस्करण को डाउनलोड करने के लिए डाउनलोड लिंक को भी बदल दिया है। यह मेरा ffmpeg संकलन कमांड है:

cd ~/ffmpeg_sources && \
wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-4.0.tar.bz2 && \
tar xjvf ffmpeg-snapshot.tar.bz2 && \
cd ffmpeg-4.0 && \
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
  --prefix="$HOME/ffmpeg_build" \
  --pkg-config-flags="--static" \
  --extra-cflags="-I$HOME/ffmpeg_build/include" \
  --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
  --extra-libs="-lpthread -lm" \
  --bindir="$HOME/bin" \
  --enable-shared \
  --enable-gpl \
  --enable-nonfree \
  --enable-ladspa \
  --enable-libsrt \
  --enable-libsoxr \
  --enable-libspeex \
  --enable-avfilter \
  --enable-avresample \
  --enable-postproc \
  --enable-pthreads \
  --enable-libfdk-aac \
  --enable-libopus \
  --enable-libass \
  --enable-libtheora \
  --enable-libvorbis \
  --enable-libvpx \
  --enable-libx264 \
  --enable-libx265 \
  --enable-libfreetype \
  --enable-libkvazaar \
  --disable-ffplay \
  --enable-libopenjpeg \
  --enable-libwebp \
  --enable-libxvid \
  --enable-libvidstab \
  --enable-libopenh264 \
  --enable-zlib \
  --enable-openssl && \
PATH="$HOME/bin:$PATH" make -j8 && \
sudo make install && \
hash -r

मैं कहता हूँ कि यह StackOverflow से संबंधित है। Ffmpeg को संकलित करने के लिए वैसे भी ज्ञान की आवश्यकता होती है।

किसी भी विचार, मैं इसे यहाँ से वहाँ कैसे स्थानांतरित कर सकता हूँ? जब मैंने Stackoverflow पर एक नया सूत्र बनाने की कोशिश की, तो उसने कहा कि मैं हर 90 मिनट में केवल एक बार पोस्ट कर सकता हूं।
Georgе Stoyanov

मैंने इसे हस्तांतरण के लिए हरी झंडी दिखाई। तो, जरा ठहरिए।

2
यदि आप प्रोग्राम को उपयोगकर्ता और डेवलपर के रूप में संकलित करने के लिए कह रहे हैं, तो इसे माइग्रेट करने की आवश्यकता नहीं है। उस ने कहा, यह उपयोगी हो सकता है यदि आप (ए) प्रश्न के शीर्षक को उदा। "मैं PIE के बिना FFMPEG कैसे संकलित करता हूं?", और (b) बताएं कि आपको PIE अक्षम क्यों चाहिए शायद वहाँ एक है दूसरा तरीका
Bob

5.4 में नहीं, GIE v.5.5 में पाई डिफ़ॉल्ट है। ... आप नए "नो-पाई" का उपयोग कर सकते हैं gcc54-c++_5.4.0-ubuntu16_amd64.deb 18.04 (और 16.04) के लिए drive.google.com/file/d/1ptHLaZXImpeMzq4xuuGGn5VjrvxNSop3/... ... प्रदान करता है /usr/bin/{gcc54, g++54, gfortran54} । इंस्टॉल करें : sudo gdebi Downloads/gcc54-c++_5.4.0-ubuntu16_amd64.deb
Knud Larsen

जवाबों:


3

मैंने एक और इंस्टॉल करने की आवश्यकता के बिना लाइबॉम संकलन निर्देशों को शामिल करने के लिए आपके द्वारा पीछा किए गए गाइड को अपडेट किया gcc या किसी भी PIE मुद्दों से निपटने:

cd ~/ffmpeg_sources && \
git -C aom pull 2> /dev/null || git clone --depth 1 https://aomedia.googlesource.com/aom && \
mkdir aom_build && \
cd aom_build && \
PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED=off -DENABLE_NASM=on ../aom && \
PATH="$HOME/bin:$PATH" make && \
make install

ये निर्देश बदलने के लिए उत्तरदायी हैं। हमेशा के लिए देखें FFmpeg Wiki: उबंटू के लिए संकलन अद्यतित निर्देशों के लिए।

फिर संकलन करें ffmpeg जैसा कि गाइड में दिखाया गया है।


वैसे, जब मैं लाइबॉम कमांड का उपयोग कर रहा हूं, जिसे आपने डाल दिया है FFmpeg Wiki: उबंटू के लिए संकलन मुझे एक त्रुटि मिली: error: ‘AV1_COMMON {aka struct AV1Common}’ has no member named ‘enhancement_layers_cnt’ operating_point >= pbi->common.enhancement_layers_cnt
Georgе Stoyanov

@ GeorgеStoyanov मैं उस त्रुटि की नकल नहीं कर सकता (या मुझे यह याद नहीं था)। निर्देशों में कौन सा कदम आपको वह संदेश देता है? क्या यह एक घातक त्रुटि है?
llogan

1

तो समस्या यह थी कि gcc7 कंपाइलर बिल्ट-इन के साथ आ रहा था --enable-default-pie तो समाधान या तो के साथ gcc recompile था -no-pie तथा -fno-pie पाई समर्थन के बिना झंडे या एक संस्करण स्थापित करें। जैसा कि नुड लार्सन ने सुझाव दिया था कि मैंने इस संस्करण को इंगित करने के लिए gcc-5.4.0 और लिंक्ड gcc और g ++ स्थापित किया है:

sudo rm /usr/bin/gcc /usr/bin/g++
sudo ln -s /usr/bin/gcc54 /usr/bin/gcc
sudo ln -s /usr/bin/g++54 /usr/bin/g++

और फिर संकलन फ़ोल्डर में निष्पादित किया गया

make clean 
make distclean 

और फिर से ffmpeg recompiled और यह मेरी समस्या हल। समाप्त करने के बाद एक अच्छा विचार आपके पुनः लिंक करने का है gcc तथा g++ आपके द्वारा स्थापित हाल के संस्करण में, मेरे मामले में जो 7 था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.