Mi primera publicación en este sitio con gran esperanza :: Estoy tratando de comprender enlaces estáticos, enlaces dinámicos, bibliotecas compartidas, bibliotecas estáticas, etc., con gcc. Cada vez que trato de profundizar en este tema, tengo algo que no entiendo del todo.en gcc cómo forzar la resolución del símbolo en el tiempo de ejecución
manos a la obra:
bash$ cat main.c
#include "printhello.h"
#include "printbye.h"
void main()
{
PrintHello();
PrintBye();
}
bash$ cat printhello.h
void PrintHello();
bash$ cat printbye.h
void PrintBye();
bash$ cat printbye.c
#include <stdio.h>
void PrintBye()
{
printf("Bye bye\n");
}
bash$ cat printhello.c
#include <stdio.h>
void PrintHello()
{
printf("Hello World\n");
}
gcc -Wall -fPIC -c *.c -I.
gcc -shared -Wl,-soname,libcgreet.so.1 -o libcgreet.so.1.0 *.o
ln -sf libcgreet.so.1.0 libcgreet.so
ln -sf libcgreet.so.1.0 libcgreet.so.1
Así que han creado una biblioteca compartida. Ahora quiero vincular esta biblioteca compartida con mi programa principal para crear un ejecutable.
gcc -Wall -L. main.c -lcgreet -o greet
Se trabaja muy bien y si fijo LD_LIBRARY_PATH antes de ejecutar saludar (o vincularlo con la opción rpath) que puede hacer que funcione.
Mi pregunta es sin embargo diferente: Desde que estoy de todos modos usando la biblioteca compartida, no es posible forzar resolución símbolo en tiempo de ejecución (no estoy seguro acerca de la terminología, pero tal vez llamada la vinculación dinámica según el libro "enlazadores y Cargadores") . Entiendo que es posible que no deseemos hacerlo, ya que esto hace que el programa se ejecute lentamente y tiene una sobrecarga cada vez que queremos ejecutar el programa, pero estoy tratando de entender esto para borrar mis conceptos.
¿Se enlazador gcc proporciona ninguna opción de retrasar resolución símbolo en tiempo de ejecución? (Hacerlo con la biblioteca vamos realmente a ejecutar el programa con) (como biblioteca disponible en tiempo de compilación puede ser diferente de la que está disponible en tiempo de ejecución si cualquier cambio en la biblioteca) yo quiero ser capaz de hacer algo como :
bash $ gcc -I main.c. (¿qué opción necesita aquí?) para no tener que dar el nombre de la biblioteca, y solo decirle que quiero hacer la resolución del símbolo en tiempo de ejecución, por lo que los encabezados son lo suficientemente buenos no son necesarios
Gracias, aprendizaje para siempre.
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html – adf88
Asegúrese de etiquetar la pregunta con el lenguaje apropiado. Está etiquetado como C++, pero el código es C. Tenga en cuenta que para poder usar la biblioteca dinámica pura, la carga del código en C++ tendrá que contener un exceso de "extern" C "rociado que no es necesario ni válido en C. –