Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
c'è un bug grosso come una casa nel linker del gcc
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Forum italiano (Italian)
View previous topic :: View next topic  
Author Message
.:chrome:.
Advocate
Advocate


Joined: 19 Feb 2005
Posts: 4588
Location: Brescia, Italy

PostPosted: Fri Apr 08, 2005 12:25 pm    Post subject: c'è un bug grosso come una casa nel linker del gcc Reply with quote

dunque dunque... sulla scia della nuova moda del forum :) ho voluto provare l'opzione --as-needed del linker, di cui si è parlato in questo thread: https://forums.gentoo.org/viewtopic-t-318552.html.

non mi sono fidato a fare l'emerge di tutto quanto, ma ho fatto solo qualche pacchetto. quando sono arrivato a xmms mi sono trovato di fronte ad un problema: https://forums.gentoo.org/viewtopic-t-320225.html
cosa strana: xmms non si compila perché dice che vuole assolutamente le lib di gtk+ in versione maggiore delle 1.2.2, e io ho installato le 1.2.10.

premetto che io sono sistemista, e non programmatore, quindi mi trovo in una condizione di profano. spero che queste righe possano essre d'aiuto per gli altri profani e che i programmatori veri non mi cazzino :?

ho cercato di capire esattamente cone funziona --as-needed.
quando si compila un programma, ne viene fatto il linking dinamico a determinate librerie. nel caso di xmms, alle gtk. queste librerie, però, hanno a loro volta dei linking dinamici, nel caso delle gtk, alle gdk, e via dicendo...
ora... se io ho per esempio un programma che mostra delle jpeg, l'unica cosa di cui ho realmente bisogno è la libjpeg. tutto il resto che si tira dietro (libpng, libtif, libungif, libcazz-in-kul, ecc...) è totalmente inutile, per il mio programma, e posso tranquillamente farne a meno. questa è la filosofia su cui lavora --as-needed.
quali vantaggi comporta questo? eseguibili più piccoli? certamente no, perché si tratta di linking dinamico. si ha una tabella dei simboli più piccola, quella senza dubbio, e senza dubbio questo porterà ad avere eseguibili leggermente più snelli nelle dimensioni e nei tempi di esecuzione, ma certamente nulla di apprezzabile. secondo me, gli incrementi di velocità notati da alcuni derivano solo dall'opzione -Os del compilatore e non dal linker.

vediamo ora di capire cosa è successo al mio xmms... guardo il config.log (non configure.log) e trovo dove è l'errore: c'è una ignobile funzione in C "conftest" che verifica la configurazione del sistema (come il nome suggerisce) prima di iniziare a compilare. questa funzione viene invocata da configure.
la funzione fallice quando viene eseguita, dopo che è stata compilata con questo comando:
Code:
gcc -o conftest -Os -march=pentium4 -mfpmath=sse -mmmx -momit-leaf-frame-pointer -msse -fomit-frame-pointer -ftracer -funroll-loops -pipe -I/usr/include/gtk-1.2 -I/usr/include/glib-1.2 -I/usr/lib/glib/include -D_REENTRANT  -Wl,-O1 -Wl,--as-needed conftest.c -L/usr/lib -lgtk -lgdk -rdynamic -lgmodule -lgthread -lglib -lpthread -ldl -lXi -lXext -lX11 -lm  >&5

il programma è questo:
Code:
/* confdefs.h.  */

#define PACKAGE_NAME ""
#define PACKAGE_TARNAME ""
#define PACKAGE_VERSION ""
#define PACKAGE_STRING ""
#define PACKAGE_BUGREPORT ""
#define PACKAGE "xmms"
#define VERSION "1.2.10"
#define DEV_DSP "/dev/dsp"
#define DEV_MIXER "/dev/mixer"
#define STDC_HEADERS 1
#define HAVE_SYS_TYPES_H 1
#define HAVE_SYS_STAT_H 1
#define HAVE_STDLIB_H 1
#define HAVE_STRING_H 1
#define HAVE_MEMORY_H 1
#define HAVE_STRINGS_H 1
#define HAVE_INTTYPES_H 1
#define HAVE_STDINT_H 1
#define HAVE_UNISTD_H 1
#define HAVE_DLFCN_H 1
#ifdef __cplusplus
extern "C" void std::exit (int) throw (); using std::exit;
#endif
/* end confdefs.h.  */

#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>

int
main ()
{
  int major, minor, micro;
  char *tmp_version;

  system ("touch conf.gtktest");

  /* HP/UX 9 (%@#!) writes to sscanf strings */
  tmp_version = g_strdup("1.2.2");
  if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
     printf("%s, bad version string\n", "1.2.2");
     exit(1);
   }

  if ((gtk_major_version != 1) ||
      (gtk_minor_version != 2) ||
      (gtk_micro_version != 10))
    {
      printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n",
             1, 2, 10,
             gtk_major_version, gtk_minor_version, gtk_micro_version);
      printf ("*** was found! If gtk-config was correct, then it is best\n");
      printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
      printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
      printf("*** required on your system.\n");
      printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n");
      printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n");
      printf("*** before re-running configure\n");
    }
#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION)
  else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
         (gtk_minor_version != GTK_MINOR_VERSION) ||
           (gtk_micro_version != GTK_MICRO_VERSION))
    {
      printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
           GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
      printf("*** library (version %d.%d.%d)\n",
           gtk_major_version, gtk_minor_version, gtk_micro_version);
    }
#endif /* defined (GTK_MAJOR_VERSION) ... */
  else
    {
      if ((gtk_major_version > major) ||
        ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
        ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
      {
        return 0;
       }
     else
      {
        printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n",
               gtk_major_version, gtk_minor_version, gtk_micro_version);
        printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n",
             major, minor, micro);
        printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
        printf("***\n");
        printf("*** If you have already installed a sufficiently new version, this error\n");
        printf("*** probably means that the wrong copy of the gtk-config shell script is\n");
        printf("*** being found. The easiest way to fix this is to remove the old version\n");
        printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n");
        printf("*** correct copy of gtk-config. (In this case, you will have to\n");
        printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
        printf("*** so that the correct libraries are found at run-time))\n");
      }
    }
  return 1;
}

e come dicevo prima, viene compilata con questo comando:
Code:
gcc -o conftest -Os -march=pentium4 -mfpmath=sse -mmmx -momit-leaf-frame-pointer -msse -fomit-frame-pointer -ftracer -funroll-loops -pipe -I/usr/include/gtk-1.2 -I/usr/include/glib-1.2 -I/usr/lib/glib/include -D_REENTRANT  -Wl,-O1 -Wl,--as-needed conftest.c -L/usr/lib -lgtk -lgdk -rdynamic -lgmodule -lgthread -lglib -lpthread -ldl -lXi -lXext -lX11 -lm  >&5

il risultato è questo conftest:
Code:
morgoth root # ldd conftest
        linux-gate.so.1 =>  (0xffffe000)
        libgtk-1.2.so.0 => /usr/lib/libgtk-1.2.so.0 (0xb7eb3000)
        libglib-1.2.so.0 => /usr/lib/libglib-1.2.so.0 (0xb7e93000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xb7e81000)
        libc.so.6 => /lib/libc.so.6 (0xb7d6f000)
        libgmodule-1.2.so.0 => /usr/lib/libgmodule-1.2.so.0 (0xb7d6c000)
        libdl.so.2 => /lib/libdl.so.2 (0xb7d68000)
        libXi.so.6 => /usr/lib/libXi.so.6 (0xb7d60000)
        libXext.so.6 => /usr/lib/libXext.so.6 (0xb7d54000)
        libX11.so.6 => /usr/lib/libX11.so.6 (0xb7ca4000)
        libm.so.6 => /lib/libm.so.6 (0xb7c82000)
        /lib/ld-linux.so.2 (0xb7feb000)
morgoth root # ./conftest
./conftest: symbol lookup error: /usr/lib/libgtk-1.2.so.0: undefined symbol: gdk_root_window

provo a rimuovere, dalla stringa di compilazione, -Wl, --as-needed:
Code:
morgoth root # gcc -o conftest -Os -march=pentium4 -mfpmath=sse -mmmx -momit-leaf-frame-pointer -msse -fomit-frame-pointer -ftracer -funroll-loops -pipe -I/usr/include/gtk-1.2 -I/usr/include/glib-1.2 -I/usr/lib/glib/include -D_REENTRANT  -Wl,-O1 test.c -L/usr/lib -lgtk -lgdk -rdynamic -lgmodule -lgthread -lglib -lpthread -ldl -lXi -lXext -lX11 -lm morgoth root # ldd conftest         linux-gate.so.1 =>  (0xffffe000)
        libgtk-1.2.so.0 => /usr/lib/libgtk-1.2.so.0 (0xb7eb3000)
        libgdk-1.2.so.0 => /usr/lib/libgdk-1.2.so.0 (0xb7e7a000)
        libgmodule-1.2.so.0 => /usr/lib/libgmodule-1.2.so.0 (0xb7e77000)
        libgthread-1.2.so.0 => /usr/lib/libgthread-1.2.so.0 (0xb7e74000)
        libglib-1.2.so.0 => /usr/lib/libglib-1.2.so.0 (0xb7e54000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xb7e42000)
        libdl.so.2 => /lib/libdl.so.2 (0xb7e3d000)
        libXi.so.6 => /usr/lib/libXi.so.6 (0xb7e36000)
        libXext.so.6 => /usr/lib/libXext.so.6 (0xb7e2a000)
        libX11.so.6 => /usr/lib/libX11.so.6 (0xb7d7a000)
        libm.so.6 => /lib/libm.so.6 (0xb7d58000)
        libc.so.6 => /lib/libc.so.6 (0xb7c46000)
        /lib/ld-linux.so.2 (0xb7feb000)
morgoth root # ./conftest

e come si può notare, funziona tutto...

cosa possiamo dedurre? come si vede nel primo ldd, non viene effettuato il linking a gdk (Gimp Drawing Toolkit), perché --as-needed decide che gdk non è richiesto da gtk. peccato che anche un ragno sa che non è così... :wink:
rimuovendo l'opzione -Wl, --as-needed si vede, nel secondo ldd che la gdk viene correttamente linkata, e tutto va a buon fine.

con ogni probabilità questo è un errore che si verificherà con ogni programma basato su gtk-1.x, ma è giusto precisare che non è un big delle gtk, ma del linker di gcc.

farò delle prove su una macchina non gentoo, per capire se è colpa del gcc di gentoo o del gcc in generale, poi sarà buona cos amandare un bug report a chi di dovere :)
Back to top
View user's profile Send private message
lavish
Bodhisattva
Bodhisattva


Joined: 13 Sep 2004
Posts: 4296

PostPosted: Fri Apr 08, 2005 12:37 pm    Post subject: Reply with quote

Fai al più presto un commit del bug, sarebbe molto utile che i devel avessero sott'occhio quanto da tu postato
_________________
minimalblue.com | secgroup.github.io/
Back to top
View user's profile Send private message
.:chrome:.
Advocate
Advocate


Joined: 19 Feb 2005
Posts: 4588
Location: Brescia, Italy

PostPosted: Fri Apr 08, 2005 12:42 pm    Post subject: Reply with quote

lavish wrote:
Fai al più presto un commit del bug, sarebbe molto utile che i devel avessero sott'occhio quanto da tu postato

certo, ma a chi? appena posso faccio una prova su una macchina che non ha installato gentoo. il problema è capire se il bug è del gcc di GNU o nel pacchetto di gentoo (anche se credo sia la prima)
Back to top
View user's profile Send private message
randomaze
Bodhisattva
Bodhisattva


Joined: 21 Oct 2003
Posts: 9985

PostPosted: Fri Apr 08, 2005 1:37 pm    Post subject: Reply with quote

k.gothmog wrote:
certo, ma a chi? appena posso faccio una prova su una macchina che non ha installato gentoo. il problema è capire se il bug è del gcc di GNU o nel pacchetto di gentoo (anche se credo sia la prima)


Come al solito puoi farlo sul bugzilla di gentoo, poi gli sviluppatori provvederanno a inoltrarlo a chi di dovere ;-)
_________________
Ciao da me!
Back to top
View user's profile Send private message
codadilupo
Advocate
Advocate


Joined: 05 Aug 2003
Posts: 3135

PostPosted: Fri Apr 08, 2005 2:45 pm    Post subject: Reply with quote

il fatto é che, non essendo io programmatore, non so se é --as-needed a rimuovere le gdk, o se é il pacchetto a non indicarle come strettamente necessarie ;-)

Coda
Back to top
View user's profile Send private message
.:chrome:.
Advocate
Advocate


Joined: 19 Feb 2005
Posts: 4588
Location: Brescia, Italy

PostPosted: Fri Apr 08, 2005 3:54 pm    Post subject: Reply with quote

codadilupo wrote:
il fatto é che, non essendo io programmatore, non so se é --as-needed a rimuovere le gdk, o se é il pacchetto a non indicarle come strettamente necessarie ;-)

uhm... capisco e condivido il tuo dubbio, ma a rigor di logica dovrebbe essere un errore del linker, che si perde una dipendenza nel momento in cui gli dico di indviiduare quelle strettamente necessarie. se fosse un bug delle gtk non si manifesterebbe in "condizioni normali" (secondo me)
Back to top
View user's profile Send private message
codadilupo
Advocate
Advocate


Joined: 05 Aug 2003
Posts: 3135

PostPosted: Fri Apr 08, 2005 4:07 pm    Post subject: Reply with quote

il fatto é che, non ricordo piu' dove, ho letto che --as-needed funziona se il config del pacchetto é stato scritto bene, ovvero ha segnato correttamente quali sono le librerie indispensabili etc... per questo m'e' venuto il dubbio: dopotutto: mica puo' capirlo da solo, gcc, cosa serve al pacchetto: é il pacchetto che glielo deve dire, anche quando gcc non usa --as-needed, no ?

Coda
Back to top
View user's profile Send private message
FonderiaDigitale
Veteran
Veteran


Joined: 06 Nov 2003
Posts: 1710
Location: Rome, Italy

PostPosted: Fri Apr 08, 2005 4:19 pm    Post subject: Reply with quote

vedi se risolvi qualcosa con
Code:
fix_libtool_files.sh <versione del gcc>

_________________
Come disse un amico, i sistemisti sono un po' come gli artigiani per l'informatica :)
Back to top
View user's profile Send private message
.:chrome:.
Advocate
Advocate


Joined: 19 Feb 2005
Posts: 4588
Location: Brescia, Italy

PostPosted: Sun Apr 10, 2005 6:23 pm    Post subject: Reply with quote

FonderiaDigitale wrote:
vedi se risolvi qualcosa con
Code:
fix_libtool_files.sh <versione del gcc>

niente da fare. pare sia proprio un difetto nel funzionamento di ld
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Forum italiano (Italian) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum