Wie kompiliere ich FFMPEG & Libaom ohne PIE

1286
Georgе Stoyanov

Ich versuche, FFMPEG und Libaom anscheinend aus dem Quellcode zu kompilieren, da die gcc- und g ++ - Compiler in Ubuntu 18.04 standardmäßig standardmäßig die folgende Option aktiviert haben: --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) 

Ich habe versucht, eine zu bestehen, --extra-ldexeflags="-no-pie -fno-pic -fno-pie"aber es hat nicht geholfen. Ich habe das gleiche Problem, wenn ich versuche, libaom zu kompilieren. Ich habe versucht, eine ältere Version von gcc zu installieren, aber auch 5.X hat diese --enable-default-pieOption standardmäßig aktiviert, so dass sie nicht gut ist. Anscheinend wurde diese Option auf Ubuntu 18.04 erzwungen und es gibt keinen Weg daran vorbei.

Das ist mein Fehler beim Versuch, libaom zu installieren:

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 

[EDIT]: Hinzufügen meines ffmpeg-Kompilierungsbefehls.

Ich folgte der Ubuntu-Kompilierungsanleitung, die unter Mein Befehl veröffentlicht wurde, war jedoch etwas anders. Ich habe das ffplay deaktiviert, da ich ffmpeg auf einem Server installiere und libsrt (Haivision Secure Reliable Transport Protocol) und libaom (AV1) aktiviere. Ich habe auch den Download-Link geändert, um die stabile Version 4.0 anstelle des neuesten nächtlichen Build herunterzuladen. Dies ist mein ffmpeg-Kompilierungsbefehl:

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 
3
Ich würde sagen, das gehört zu StackOverflow. Für das Kompilieren von ffmpeg ist ohnehin arkanes Wissen erforderlich. vor 6 Jahren 0
eine Idee, wie ich es von hier nach dort verschieben kann? Als ich versuchte, einen neuen Thread in Stackoverflow zu erstellen, sagte er, dass ich nur alle 90 Minuten einen Beitrag posten kann. Georgе Stoyanov vor 6 Jahren 0
Ich habe es für den Transfer markiert. Also warte einfach ab. vor 6 Jahren 0
Wenn Sie nach dem Kompilieren des Programms als Benutzer und nicht als Entwickler fragen, muss dies nicht migriert werden. Das heißt, es könnte nützlich sein, wenn Sie (a) den Titel der Frage ändern, z. B. "Wie kompiliere ich FFMPEG ohne PIE?" Und (b) erklären, warum Sie PIE deaktiviert haben. Möglicherweise gibt es eine alternative Lösung (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Bob vor 6 Jahren 2
PIE ist in gcc v.5.5 voreingestellt, nicht in 5.4. ... Sie können die neue "no-pie" `gcc54-c ++ _ 5.4.0-ubuntu16_amd64.deb` für 18.04 (und 16.04) https://drive.google.com/file/d/1ptHLaZXImpeMzq4xuuGGn5VjrvxNSop3/view verwenden ? usp = sharing ... Stellt `/ usr / bin / ` zur Verfügung. Installieren Sie: `sudo gdebi Downloads / gcc54-c ++ _ 5.4.0-ubuntu16_amd64.deb` Knud Larsen vor 6 Jahren 0
Funktioniert für mich im 18.04. Zeigen Sie Ihren `cmake'-Befehl oder die erforderlichen Informationen, um das Problem zu duplizieren. LordNeckbeard vor 6 Jahren 0
Dank @KnudLarsen konnte ich erfolgreich ffmpeg und libaom kompilieren. Ich habe auch den Titel als "Alternativlösung" vorgeschlagen. Georgе Stoyanov vor 6 Jahren 0
Ich musste nicht das PIE-lose `gcc 'zum Kompilieren verwenden: Ich sollte klarstellen, dass ich es gemeint habe, als ich sagte, dass es" für mich funktioniert ". Ich wollte Ihr spezifisches Problem zuerst lösen, bevor Sie Kompilieranweisungen bereitstellten (deshalb habe ich nach den von Ihnen verwendeten Befehlen gefragt, damit ich Ihr Problem replizieren kann). Wenn Sie eine Lösung gefunden haben, können Sie diese auch als Antwort hinzufügen. LordNeckbeard vor 6 Jahren 0

2 Antworten auf die Frage

3
LordNeckbeard

Ich habe den von Ihnen befolgten Leitfaden aktualisiert, um Anweisungen für die Libaom-Kompilierung aufzunehmen, ohne dass Sie einen anderen installieren gccoder PIE-Probleme lösen müssen:

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 

Diese Anweisungen können sich ändern. Beziehen Sie sich immer auf FFmpeg Wiki: Compilieren für Ubuntu, um aktuelle Anweisungen zu erhalten.

Dann kompilieren Sie ffmpegwie in der Anleitung gezeigt.

Wenn ich den libaom-Befehl verwende, den Sie in [FFmpeg Wiki: Compiling for Ubuntu] (https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu) eingegeben haben, erhalte ich eine Fehlermeldung: `error: ' AV1_COMMON 'hat kein Mitglied mit dem Namen' enhancement_layers_cnt 'operating_point> = pbi-> common.enhancement_layers_cnt`. Georgе Stoyanov vor 6 Jahren 0
@ GeorgеStoyanov Ich kann diesen Fehler nicht wiederholen (oder ich habe ihn übersehen). Welcher Schritt in der Anleitung gibt Ihnen diese Nachricht? Ist es ein schwerwiegender Fehler? LordNeckbeard vor 6 Jahren 0
1
Georgе Stoyanov

Das Problem war also, dass der gcc7-Compiler bereits mit eingebaut war. --enable-default-pieDie Lösung bestand also entweder darin, das gcc mit -no-pieund flag neu zu kompilieren -fno-pieoder eine Version ohne die Pie-Unterstützung zu installieren. Als Knud Larsen vorschlug, habe ich gcc-5.4.0 installiert und gcc und g ++ verlinkt, um auf diese Version zu verweisen:

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++ 

und dann im Zusammenstellungsordner ausgeführt

make clean  make distclean  

und erneut kompiliert ffmpeg und dies löste mein Problem. Wenn Sie fertig sind, sollten Sie Ihre gccund g++die neueste Version, die Sie installiert haben, erneut verknüpfen. In meinem Fall war dies 7.