# [prelink] Cannot prelink (Résolu)

## Enlight

```
prelink: /usr/X11R6/bin/glxinfo: Cannot prelink against non-PIC shared library /usr/lib/opengl/nvidia/lib/libGL.so.1

prelink: /usr/X11R6/bin/xdriinfo: Cannot prelink against non-PIC shared library /usr/lib/opengl/nvidia/lib/libGL.so.1

prelink: /usr/X11R6/bin/glxgears: Cannot prelink against non-PIC shared library /usr/lib/opengl/nvidia/lib/libGL.so.1

Executing /sbin/init U
```

Sachant que j'utilise -fPIC depuis le bootstrap, est-ce normal d'avoir ce message pour ces librairies? Ou dois-je faire un rapport de bogue?Last edited by Enlight on Mon Jan 24, 2005 10:18 am; edited 1 time in total

----------

## mr_pouit

oui c'est normal, c'est à cause des pilotes nvidia... ils ne peuvent pas être prélinkés, et tous les fichiers qui sont liés à ces bibliothèques non plus...

et ça ne pourra être résolu que par nvidia  :Sad: 

[MàJ] waouh j'ai réussi à griller quelqu'un (ça me change)... ça se fête !   :Laughing: Last edited by mr_pouit on Mon Jan 24, 2005 8:16 am; edited 1 time in total

----------

## kernelsensei

les libs nvidia ne sont pas 100% opensources il me semble, donc ya pas tout qui est compile sur ta machine, je pense que c'est la raison pour laquelle ca gueule !

EDIT: Ohh grillé !

----------

## Enlight

Merci, je voulais être sûr!

----------

## sirlark

Hi,

try putting 'pic' into your USE flags

then

emerge -u --newuse --deep system

emerge -u --newuse --deep world

Some libraries are still broken simply because they can't be linked using -fPIC

----------

## LostControl

 *Quote:*   

> -fPIC
> 
>     If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding any limit on the size of the global offset table. This option makes a difference on the m68k and the SPARC.
> 
>     Position-independent code requires special support, and therefore works only on certain machines. 

 

Quelqu'un pourrait me dire ce qu'apporte concretement cette option ?

Merci

----------

## yoyo

Tout est expliqué ici : Guide pour le Prelink sous Gentoo.

----------

## Enlight

```
man gcc
```

 *Quote:*   

> Generate position-independent code (PIC) suitable for use in a
> 
>            shared library, if supported for the target machine...

 

----------

## kernelsensei

il me semble qu'il ne faut pas l'ajouter explicitement aux Cflags, mais plutot utiliser le USEFLAG pic a la place ! (j'avais lu une remarque la dessus quelquepart !)

----------

## LostControl

 *Enlight wrote:*   

> 
> 
> ```
> man gcc
> ```
> ...

 

Merci  :Very Happy:  C'est excellent cette commande "man" !!! Je connaissais pas !!! C'est con mais ce que j'ai trouvé dans le manuel online de GCC me semble encore plus complet...

Est-ce que ce flag est obligatoire pour linker dynamiquement ? Ca m'étonne car je n'ai pas souvenir de l'avoir vu souvent lors des compilations. Est-ce que ce flag est rajouté "automatiquement" et je ne l'ai pas remarqué ? J'ai déjà lu le howto de prelink mais personne n'a une explication plus "technique" ?

Merci

----------

## kernelsensei

tu ne connaissais pas man ??

je t'en apprends une autre tiens !!

```
info gcc
```

----------

## yoyo

Extrait du [HOWTO] Tuning Gentoo présent sur ce forum :

 *Quote:*   

> Prelink est une application puissante, permettant de linker les librairies d'un binaire avant de l'utiliser. Ainsi, au lieu de vérifier quelles librairies seront utilisées, prelink va modifier le binaire en ajoutant une petite description des librairies nécessaires pour tourner. Cela évite de chercher les librairies partagées à chaque fois que l'exécutable est lancé, donc l'accélère.
> 
> Important: A chaque fois que vous mettez à jour les librairies nécessaires aux binaires (par exemple glibc), vous devez relancer prelink sur le système..
> 
> C'est une petite optimisation qui sera appréciable lors du lancement de grosses applications telles que KDE (D'ailleurs, si vous prélinkez votre système, KDE ne devra plus lancer kdeinit, donc ça tournera plus vite). Les petits binaires sont rapides, donc peu sensibles au prélink.
> ...

 

Ceci plus l'intro du lien précédent :  *Quote:*   

> Qu'est-ce que le prelink et en quoi peut-il m'être utile ?
> 
> La plupart des applications utilisent des bibliothèques partagées (« shared libraries »). Ces bibliothèques partagées ont besoin d'être chargées en mémoire lors de l'exécution de l'application et les références aux différents symboles doivent être résolues. Pour la plupart des petits programmes, cette liaison dynamique est très rapide. Mais pour les programmes écrits en C++ qui ont beaucoup de dépendances, la liaison dynamique peut prendre un temps considérable.
> 
> Sur la plupart des systèmes, les bibliothèques ne changent pas souvent et quand un programme est en cours d'exécution l'opération de liaison est toujours la même. Le prelink utilise ceci à son avantage en évitant la liaison et en l'enregistrant dans l'exécutable. Comme pour la liaison, vous avez besoin de ld-linux.so dans la glibc et, pour pouvoir utiliser le prelink, vous devez avoir une version de la glibc >=glibc-2.3.1-r2.
> ...

 

Je ne sais pas si c'est assez "technique" ...

@kernel_sensei : +1 pour l'utilisation du USEflag; comme dit ici, le prelink est surtout utile pour les programmes écrits en C++ (typiquement utilisant qt). Le fait d'ajouter -fPIC aux CFLAGS va forcer le prelink sur tous les binaires et les faire grossir, donc ralentir leur exécution, ce qui est l'inverse du but recherché avec le prelink.

Évidemment, si tout est lié statiquement (USEflag "static"), le prelink ne présente aucun intérêt (mais qui utilise ce USEflag ??) ...

----------

## Enlight

Youpi... je peux tout recompiler   :Sad: 

----------

## yoyo

 *Enlight wrote:*   

> Youpi... je peux tout recompiler  

  Pourquoi ??

----------

## Enlight

 *Quote:*   

> Sachant que j'utilise -fPIC depuis le bootstrap, est-ce normal d'avoir ce message pour ces librairies? Ou dois-je faire un rapport de bogue?

 

et

 *Quote:*   

> Le fait d'ajouter -fPIC aux CFLAGS va forcer le prelink sur tous les binaires et les faire grossir, donc ralentir leur exécution, ce qui est l'inverse du but recherché avec le prelink. 
> 
> Évidemment, si tout est lié statiquement (USEflag "static"), le prelink ne présente aucun intérêt (mais qui utilise ce USEflag ??) ...

 

d'ailleurs je sais pas trop ce qui se passe mais bon, j'ai fait un stage 1 over stage 3 avec ntpl, gcc 3.4.3 avec des flags plutots agressifs (genre o3 -mfpmath=sse,387)  et je trouvais que ça roxait pas trop... 20 secondes à compter du démarrage pour avoir ma console en FB alors que ahmha... win en mets 12 pou se lancer... 

edit : j'avais déjà fait une install en -O3 et ça wattait plutôt fort

----------

## Polo

 *kernel_sensei wrote:*   

> tu ne connaissais pas man ??
> 
> je t'en apprends une autre tiens !!
> 
> ```
> ...

 

et le mieux c'est que ca marche aussi pour quasiment toutes les commandes...

```
man mount

man ls

man ln
```

et ainsi de suite....

----------

## LostControl

Merci,

Pour l'histoire du man et autre info, c'était une façon de dire que j'avais déjà cherché dans la doc de GCC et que le man ne m'apprenait rien de plus sur ce coup-là !

Je repose ma question en prenant un exemple. J'ai recompilé le package sys-apps/procps qui contient l'exécutable "ps".

```
# emerge -v --oneshot procps 2> /dev/null|grep PIC

#
```

Résultat: aucun -fPIC durant la compilation. Pourtant "ps" est bien linké dynamiquement.

```
# ldd /bin/ps

        linux-gate.so.1 =>  (0xffffe000)

        libproc-3.2.4.so => /lib/libproc-3.2.4.so (0x463fd000)

        libc.so.6 => /lib/libc.so.6 (0x462e5000)

        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x462cc000)
```

Je re-prelink le tout et vérifie bien que le prelink sur "ps" est bon.

```
# LD_DEBUG=libs ps

      1427:     find library=libproc-3.2.4.so; searching

      1427:      search cache=/etc/ld.so.cache

      1427:       trying file=/lib/libproc-3.2.4.so

      1427:

      1427:     find library=libc.so.6; searching

      1427:      search cache=/etc/ld.so.cache

      1427:       trying file=/lib/libc.so.6

      1427:

prelink checking: ok

      1427:

      1427:     calling init: /lib/libc.so.6

      1427:

      1427:

      1427:     calling init: /lib/libproc-3.2.4.so

      1427:

      1427:

      1427:     initialize program: ps

      1427:

      1427:

      1427:     transferring control: ps

      1427:

  PID TTY          TIME CMD

20720 pts/0    00:00:00 su

20723 pts/0    00:00:00 bash

 1427 pts/0    00:00:00 ps

      1427:

      1427:     calling fini: /lib/libproc-3.2.4.so

      1427:

      1427:

      1427:     calling fini: /lib/libc.so.6

      1427:
```

Mmhh... Ca a l'air bon. Mais là je me dis: comment se fait-il que "ps" est linké dynamiquement et de plus que prelink fonctionne alors que ni "ps" ni "libproc" n'ont été compilé avec -fPIC ??? Comment se fait-il que je puisse linker un programme de manière dynamique sans utiliser ce flag -fPIC ???

Merci

----------

