ΕΕΛ/ΛΑΚ - Λίστες Ταχυδρομείου

Re: Gcc 4.6 (Ubuntu)

2011/10/3 Nick Kossifidis <mickflemm [ at ] gmail [ dot ] com>:
> Και ξαναρωτάω γιατί πραγματικά δε πιστεύω ότι γράφω Κινέζικα, πού
> ακριβώς λέω ότι φταίει κάτι/κάποιος ? Απλά ρωτάω αν έχετε δει κάτι
> αντίστοιχο ! Έστω ότι έχω memory corrupting bug, γιατί στον 4.4.6 και
> στον 4.5.2 δε φαίνεται και όλα δουλεύουν μια χαρά και φαίνεται στον
> 4.6 ?

FWIW, Στην πραγματικότητα σε ubuntu oneiric τουλάχιστον το θέμα αυτό
εμφανίζεται και στον 4.5. Testcase:

apt-get install libssl-dev libcurl4-openssl-dev
wget http://github.com/bagder/curl/raw/master/docs/examples/simplessl.c
export STUFF=`pkg-config --cflags --libs openssl libcurl`

gcc-4.4 $STUFF -simplessl.c
works ok

gcc-4.5 $STUFF -simplessl.c
boom! (collect2: ld returned 1 exit status κλπ)

gcc-4.6 $STUFF -simplessl.c
boom! (collect2: ld returned 1 exit status κλπ)

Το παραπάνω οφείλεται στα patches που προσθέτει το debian/ubuntu στο
gcc και συγκεκριμμένα στο debian/patches/gcc-as-needed.diff όπου το debian
αλλάζει τα default linker specs.

Τουτέστιν ο linker σου (ld) στο debian/ubuntu τρέχει με --as-needed
*είτε το έβαλες εσύ είτε όχι*.

Αυτό σημαίνει ότι αν έχεις ένα object foo.o που κάνει link στο libbaz
πρέπει να βάλεις το -lbaz μετά το foo.o αλλιώς ο ld θα το παραλείψει
με αποτέλεσμα μετά να βλέπει unresolved symbols.

Άρα λύσεις στο ubuntu oneiric:

1. apt-get install gcc-4.4 και compile με αυτόν διατηρώντας τα ίδια
    scripts που έχεις ως τώρα.

2. recompile το gcc χωρίς το gcc-as-needed.diff (not recommended
    καθώς νομίζω ότι το --as-needed είναι καλό default).

3. να αλλάξεις το script σου και να χρησιμοποιείς CFLAGS, LDFLAGS
    και LIBADD όπως λένε οι προδιαγραφές (recommended).

Χαιρετισμούς,
Παντελής

απαντήσεις

αναφορές

πλοήγηση μηνυμάτων