2014-05-21 3 views
5

Vogliamo creare una libreria condivisa (.so) per indirizzare tutte le distribuzioni, comprese quelle vecchie. Il codice è scritto in C++ e utilizza le caratteristiche di C++ 11, quindi il compilatore deve essere almeno gcc 4.7. Abbiamo notato che se compiliamo il nostro codice su una macchina Linux con gcc 4.7.2 installato (ad esempio, Ubuntu 12.10), allora il file .so ha "versione 1 (GNU/Linux)" mentre su sistemi operativi precedenti (es., CentOS 5.6) la versione è "versione 1 (SYSV)" - e le librerie con la versione più recente GNU/Linux non possono essere usate su sistemi operativi più vecchi.Compilare una libreria condivisa su Linux per indirizzare tutte le distribuzioni

Così abbiamo provato l'approccio di installare gcc 4.7 sulla macchina CentOS 5.6, compilare il nostro codice con questo compilatore e collegare staticamente con libstdC++ (-static-libstdC++) - questo ha prodotto un file .so che era utilizzabile su ogni linux trovato .

E questo ha funzionato bene per 32-bit. Tuttavia, quando abbiamo seguito lo stesso approccio su un sistema operativo a 64 bit (CentOS), questo non è riuscito con l'errore che il libstdC++. Esistente a cui abbiamo cercato di collegarci è stato compilato senza -fPIC. .

così abbiamo cercato di compilare il gcc 4.7.2 fonti con l'opzione “-con-pic”, ma non abbiamo potuto collegare alla nuova libstdC++ a - l'errore è:

/opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld: /usr/local/lib/libFoo.so: version node not found for symbol [email protected]_3.4 /opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld: failed to set dynamic section sizes: Bad value collect2: error: ld returned 1 exit status

Noi googled su che compilare libstdC++ con -fPIC può essere problematico, ma perché funziona per 32-bit e non per os a 64-bit? C'è un altro modo suggerito per creare uno .so per tutte le distribuzioni Linux?

+0

Come sarebbe questo anche il lavoro? – mjs

+0

+1 Domanda ben studiata! L'errore non è probabilmente colpa tua: ho cercato su google "non è riuscito a impostare le dimensioni dinamiche delle sezioni: valore errato" e ho visto solo i bugreports in arrivo. Tra l'altro '_ZNSs7_M_copyEPcPKcm' nel messaggio di errore è' std :: basic_string , std :: allocator > :: _ M_copy (char *, char const *, unsigned long) '. – Ali

risposta

-1

Il collegamento statico a libc/libstdC++ non dovrebbe essere eseguito, anche se funziona! È piuttosto pericoloso, perché molti aspetti della sicurezza richiedono aggiornamenti alla libc. Se linkato staticamente in nessun aggiornamento può riempire il buco.

Non riesco a credere che esiste una libc "generica" ​​che funziona su tutte le piattaforme linux. La libc è l'interfaccia per il sistema installato che è un grande pool di differenze. Come dovrebbe una lib adatta a tutti?

durante il collegamento si potrebbe provare

-static-libstdc++ -static-libgcc 

in opzione ai ld. Forse questo aiuta. Ma non lo farei mai!

+0

-1 Non sta tentando di collegare libc staticamente. Per favore rileggi la domanda – Ali

+0

Grazie! Ha provato a creare una libreria che funziona su più piattaforme. Quindi credo che libstdC++ richieda libgcc. Mi spiace di dare un suggerimento a questo :-) – Klaus

+0

Anche se si collega libstdC++ staticamente, non penso sia necessario collegare libc staticamente. La tua risposta non risponde alle sue domande: "perché funziona per sistemi operativi a 32 bit e non per sistemi operativi a 64 bit? C'è un altro modo consigliato di creare uno .so per tutte le distribuzioni Linux?" Quindi non posso ritrattare il mio downvote, mi dispiace. – Ali

2

Ho risposto a questa https://gcc.gnu.org/ml/libstdc++/2014-05/msg00107.html

This looks like https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54482 so might be fixed in GCC 4.7.3 (but I'm not sure)

...

PIC is implemented differently for x86 and x86_64, because 64-bit mode has built-in support for it.

+1

Mi sono imbattuto in questo stesso problema e posso confermare che l'aggiornamento a 4.7.3 (da 4.6.3) ha risolto il problema per me. Domanda correlata: http://stackoverflow.com/questions/28593592/how-to-link-with-libstdc-pic-a-with-gcc/28625188#28625188 – Edward