View this PageEdit this PageUploads to this PageVersions of this PageHomeRecent ChangesSearchHelp Guide

Compilar un binario enlazado estáticamente en Solaris

Con el Sun CC Pro, la opción de enlazado estático es "-dn" (-dy es para dinámico).

El problema viene de que el orden en que se ponene las librerías en la línea de enlazado sí importa, y hay que ponerlas desde la más específica a la más general.

Ejemplo:

cc -c dlstubs.c
cc -c warp_and_send.c
cc -dn -o warp_and_send warp_and_send.o -L/usr/X11R6/lib -lXtst -lXext -lX11 -lXpm -lsocket -lnsl dlstubs.o
# NOTA: ver http://www.deer-run.com/~hal/sol-static.txt


En http://www.deer-run.com/~hal/sol-static.txt explican que, por desgracia, en la libc estática no están las funciones de cargar librerías de forma dinámica (dl*), pero que libnsl las menciona (y libnsl se necesita parta poder meter libsocket, que a su vez es para poder usar sockets).

La solución es hacer un pequeño ficherito llamado dlstubs.c que contenga lo siguiente:

        #include <sys/types.h>
        #include <dlfcn.h>

        /* dl*() stub routines for static compilation.  Prepared from
           /usr/include/dlfcn.h by Hal Pomeranz <hal@deer-run.com> */

        void *dlopen(const char *str, int x) {}
        void *dlsym(void *ptr, const char *str) {}
        int dlclose(void *ptr) {}
        char *dlerror() {}
        void *dlmopen(Lmid_t a, const char *str, int x) {}
        int dladdr(void *ptr1, Dl_info *ptr2) {}
        int dldump(const char *str1, const char *str2, int x) {}
        int dlinfo(void *ptr1, int x, void *ptr2) {}

        void *_dlopen(const char *str, int x) {}
        void *_dlsym(void *ptr, const char *str) {}
        int _dlclose(void *ptr) {}
        char *_dlerror() {}
        void *_dlmopen(Lmid_t a, const char *str, int x) {}
        int _dladdr(void *ptr1, Dl_info *ptr2) {}
        int _dldump(const char *str1, const char *str2, int x) {}
        int _dlinfo(void *ptr1, int x, void *ptr2) {}


Y se compila con
 cc -c dlstubs.c