web-dev-qa-db-fra.com

Comment recompiler avec -fPIC

J'essayais de réinstaller mon ffmpeg, en suivant ceci guide , sur mon ARM machine Ubuntu. Malheureusement, lorsque je compile un programme qui utilise cette lib, j'obtiens l'échec suivant :

/usr/bin/ld: /usr/local/lib/libavcodec.a(amrnbdec.o): relocation R_ARM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libavcodec.a: could not read symbols: Bad value
collect2: ld returned 1 exit status

Maintenant, je voudrais le recompiler avec -fPIC comme le suggère le compilateur mais je ne sais pas comment. Toute aide est appréciée.

55
user1455085

en bref, l'erreur signifie que vous vous ne pouvez pas utiliser une bibliothèque statique pour être liée avec une bibliothèque dynamique. La méthode correcte consiste à compiler libavcodec dans .so au lieu de .a, de sorte que l’autre bibliothèque .so que vous essayez de créer se liera bien.

le plus court chemin consiste à ajouter --enable-shared à ./configure options. ou même vous pouvez essayer de désactiver les bibliothèques partagées (ou statiques) ... vous choisissez ce qui vous convient!

61
zaufi

Regardez cette page.

vous pouvez essayer d'ajouter globalement le drapeau en utilisant: export CXXFLAGS="$CXXFLAGS -fPIC"

15
Kraiden

Après la configuration, vous avez probablement un fichier makefile. Dans ce fichier, recherchez CFLAGS (ou similaire). puf -fPIC à la fin et exécutez make again. En d'autres termes, -fPIC est une option du compilateur qui doit être passée quelque part au compilateur.

6
dmaij

J'ai rencontré le même problème en essayant d'installer Dashcast sur Centos 7. Le correctif consistait à ajouter -fPIC à la fin de chaque CFLAGS dans le Makefile x264. Ensuite, j'ai dû courir make distclean pour x264 et ffmpeg et reconstruit.

1
Tony Pavick

J'ai eu ce problème lors de la construction de bibliothèques statiques FFMPEG (par exemple, libavcodec.a) pour Android x86_64 (cible cible) (à l'aide de Android NDK clang). Le problème est survenu alors que tous les fichiers objet FFMPEG C -> (* .o) ont été compilés avec l’option de compilation -fPIC:

x86_64/libavcodec.a(h264_qpel_10bit.o): 
requires dynamic R_X86_64_PC32 reloc against 'ff_pw_1023' 
which may overflow at runtime; recompile with -fPIC

Le problème ne s'est produit que pour libavcodec.a et libswscale.a.

La source de ce problème est que FFMPEG dispose d’optimisations d’assembleur pour les plates-formes x86 * , par exemple. la cause du problème signalé est dans libavcodec/h264_qpel_10bit.asm -> h264_qpel_10bit.o.

Lors de la création d'une bibliothèque statique X86-64 bits (par exemple, libavcodec.a), il ressemble à des fichiers assembleurs (par exemple, libavcodec/h264_qpel_10bit.asm) utilise des commandes d'assembleur x86 (32 bits) qui sont incompatibles avec une liaison statique. avec la bibliothèque cible x86-64 bits car elles ne prennent pas en charge le type de relocalisation requis.

Solutions possibles :

  1. compile tous les fichiers ffmpeg sans optimisation d'assembleur (pour ffmpeg, c'est l'option de configuration suivante: --disable-asm)
  2. produire des bibliothèques dynamiques (par exemple, libavcodec.so) et les lier de manière dynamique à votre bibliothèque finale

J'ai choisi 1) et cela a résolu le problème.

Référence: https://tecnocode.co.uk/2014/10/01/dynamic-relocs-runtime-overflows-and-fpic/

0
Robert Lujo