# [HOWTO] Prelink (Nvidia incluido)

## Franco Gotusso

Introducción

Ya que la guía de Gentoo sobre prelink está muy desactualizada, voy a explicar los pasos a seguir para utilizar correctamente prelink e incluso como prelinkear los drivers de nvidia.

¿Qué es prelink?

Muchos programas usan bibliotecas compartidas que deben cargar al iniciarse. Para los programas pequeños el tiempo de carga es muy corto pero para los programas escritos en C++ (En su mayoría los de KDE) y los que usan muchas bibliotecas, el tiempo de carga es mayor. Prelink es un programa que modifica las bibliotecas compartididas ELF y los binarios ELF enlazados dinámicamente, esto hace que el tiempo  y la memoria que necesita el enlazador dinámico al inicio y durante la ejecución del programa sea significativamente menor. Todo esto sólo se usa si todas las bibliotecas dependientes no han cambiado desde el último prelinkeado, en otro caso los programas funcionarán normalmente.

Prelinkeando

El primer paso será emerger prelink.

```
emerge prelink
```

Ahora, (Y esto es muy importante) debeis agregar la use "pic" a vuestro make.conf, lo cual nos permitirá prelinkear nuestros binarios. Tendreis que actualizar ciertos programas.

```
"emerge -uDv --newuse world
```

Después, para poder prelinkear los drivers de nvidia, tenedremos que ejecutar temporalmente lo siguiente, pero no hagais un env-update.

```
opengl-update xorg-x11
```

Por último, realizamos por fin el prelinkeado.

```
prelink -avmfR

```

La última línea al acabar debería ser "Executing /sbin/init U", si no es el caso es que no todo a sido prelinkeado. Revisa los pasos anteriores.

Ahora, para volver a usar el archivo libgl.so de nvidia ejecuta:

```
opengl-update nvidia
```

Si usas KDE debes editar en el fichero /etc/env.d/99kde-env lo siguiente:

```
#KDE_IS_PRELINKED=1

KDE_IS_PRELINKED=1
```

Para finalizar:

```
env-update

source /etc/profile 
```

Reinicia y disfruta.

Créditos

Traducido del post original de hds.

----------

## German3D

Te lo curras  :Wink: 

Esto del prelink es bueno para los que reinician 1 vez al dia el PC no? Si lo dejas encendido esto no afecta verdad ¿?

54|u2

----------

## Franco Gotusso

Muchas gracias.

Sobre tu pregunta, el prelink afecta al ejecutable que no este en memoria, es decir que afecta cuando es la primera vez que arrancas el programa desde que enciendes el ordenador o si ya habais abierto el programa pero ya has cargado tantas cosas o ha pasado tanto tiempo que el kernel lo ha quitado de la ram.

Salud!

----------

## SpOeK

Hola, siento decirlo pero con esto no consigues prelinkar las bibliotecas de nVidia.

Cuando cambias con opengl-update la interfaz OpenGL y ejecutas el prelink consigues que los binarios que referenciaban antes al binario de nVidia lo hagan al de Xorg-x11, que sí puedes prelinkar.

Por tanto, no puedes hacer nada, por cómo ha generado nVidia esos binarios. Lo único que consigues es que no aparezcan tantos errores pero nada más.

----------

## psm1984

 *Franco Gotusso wrote:*   

> Lo que hace prelink es incluir esas bibliotecas dentro del propio programa para acelarar su carga.

 

Prelink no incluye las librerias dentro del programa, en man prelink viene una buena descripcion.  :Wink: 

----------

## Franco Gotusso

 *Quote:*   

> Hola, siento decirlo pero con esto no consigues prelinkar las bibliotecas de nVidia.
> 
> 

 

Ya, si te fijas es lo que dicen en los comentarios del howto original y lo que el autor discute, y aunque me parece entender lo mismo que tu me pierdo un poco, de modo que he preferido hacer una simple traduccion ya que a la malas lo unico que va a pasar es que esos binarios no se prelinkeen.

 *Quote:*   

> Prelink no incluye las librerias dentro del programa, en man prelink viene una buena descripcion. Wink

 

Vale, tienes razon pero ¿como traduzco yo eso?  :Shocked:   Nunca, en toda mi vida, he aprendido tanto ingles como el que estoy aprendiendo con el software libre  :Confused: 

Ya lo arreglare.

----------

## psm1984

Lo he traducido con ayuda de traductores web, no te fies mucho, que mi ingles es bastante malo (y el de los traductores web ... x'D).

 *Quote:*   

> 
> 
> prelink es un programa que modifica las bibliotecas compartididas ELF y los enlaces binarios dinamicos ELF, esto hace que el tiempo necesario para hacer el enlace dinamico para la relocalizacion al inicio sea significativamente disminuido y tambien, debido a un numero menor de relocalizaciones en tiempo de ejecucion, el consumo de memoria diminuye (especialmente el numero de paginas no compartidas). Tal informacion solo es usada si todas las bibliotecas dependientes no han cambiado desde el ultimo prelinking, en otro caso los programas realizan la relocalizacion normalmente.
> 
> Primero prelink recolecta los binarios ELF que deben ser prelinked y todas las bibliotecas que dependan de el. Entonces asigna un unico slot del espacio de direcciones virtual por cada biblioteca, y reenlaza la biblioteca compartida con la direccion base. Cuando el enlazador dinamico quiere cargaruna biblioteca, a menos que el slot de direccion virtual este ocupado, lo mapeara en el slot dado. Una vez hecho esto, prelink, con ayuda del enlazador dinamico, resuelve todas la relocalizaciones en el binario o bibliotecas contra sus bibliotecas dependientes y las guarda dentro del objeto ELF. Esto tambien guarda una lista de todas la bibliotecas dependientes junto con sus checksums. Para los binarios, tambien cuenta una lista de conflictos (relocalizaciones que resuelven diferentemente en una busqueda de simbolos binarios que en el alcance mas pequeño de la busqueda en el cual la biblioteca dependiente fue resuelta) y lo guarda dentro de una seccion especial del ELF.
> ...

 

----------

## Franco Gotusso

Muchas gracias, al final solo he usado el primer parrafo porque no creo que sea necesario explicar todo el proceso, al fin y al cabo solo es un howto  :Smile: 

Muchas gracias.

----------

## Cadena Perpetua

Bueno antes que nada  GRACIAS  por tomarte el trabajo de hacer este how-to, esta muy bien hecho... segui los pasos y todo funcionó a la perfeccion, personalmente no noté diferencia, pero nunca está de mas hacerlo!! gracias  :Very Happy:   :Laughing:   :Wink: 

----------

## Franco Gotusso

Lo se, nunca hay demasiada diferencia, pero la hay.  :Very Happy:  Donde mas se nota es en las aplicaciones escritas en C++, KDE principalmente. En fin, salud.

----------

