2017-06-13 1 views
0

Préambule: cette question est pas sur Oracle, au lieu que je voudrais comprendre la différence fondamentale entre gcc-4 et gcc-6 le traitement du code indépendant de la position. J'ai donc décidé d'essayer une installation Oracle 12c sur une extension Debian .gcc -fPIC -fPIE: différence betweenn gcc-4 et gcc-6

Au cours de l'étape de liaison avec gcc-6, les messages d'erreur comme les éléments suivants sont émis:

/usr/bin/ld: /opt/oracle/product/12.2.0/lib/libpls12.a(pci.o): 
    relocation R_X86_64_32S against `.rodata.str1.4' can not be used when making a shared object; 
    recompile with -fPIC. 

Cependant, si je passe le compilateur d'utiliser gcc-4.9, tout l'enchaînement se fait sans aucun problème.

Ainsi mes 2 questions:

  • Y at-il un changement dans les valeurs par défaut pour -fPIC et -fPIE entre gcc version 4 et 6? Très probablement oui, la version 6 semble utiliser les 2 options par défaut.
  • Plus important pour moi: est-ce que gcc, version 6 a une option pour utiliser le comportement de la version 4 pour la génération de code indépendant de la position? (Ou vais-je tôt ou tard, ne sera plus en mesure de lier contre vieux bibliothèques parce que gcc-4 est plus disponible?)

Répondre

0

Très probablement l'éditeur de liens gcc-6 crée la position par défaut executables indépendants. Le problème peut être reproduit comme suit et résolu en ajoutant le drapeau de linker -NO-pie:

UNIX # gcc-6 -g -Wall -fno-pic -c helloworld.c -o helloworld.o 

UNIX # gcc-6 -g -Wall helloworld.o -o helloworld 
/usr/bin/ld: helloworld.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC 
/usr/bin/ld: final link failed: Nonrepresentable section on output 
collect2: error: ld returned 1 exit status 

UNIX # gcc-6 -g -Wall -no-pie helloworld.o -o helloworld 

En effet, après avoir ajouté -NO-pie aux options gcc utilisées par Oracle, reliant les travaux sans erreur.

0

La solution de Broeni fonctionne bien. Quelques étapes supplémentaires que j'ai fait pour le faire fonctionner:

Lors de l'installation, j'ai modifié l'outil de liaison par défaut d'Oracle, la modification du fichier

/opt/oracle/product/12.2.0/db1/bin/orald 

Dans les premières lignes, je forcé d'utiliser éditeur de liens GCC, et ajouter l'option -no-pie:

#if [ -z "$BASH_VERSION" -o -n "$ORALD_USE_GCC" ] ; then 
    exec gcc -no-pie "[email protected]" 
    exit 1 
#fi 

tags: Oracle 12c debian extensible