Creazione di un'app a 32 bit in Ubuntu a 64 bit

20

Dopo ore di googling, decido di arrendermi e chiederti degli esperti. Sto cercando di creare un'applicazione a 32 bit (xgap se qualcuno interessato) nel mio 64 Ubuntu 11.10. Ho aggiunto CFLAGS = -m32 e LDFLAGS = -L / usr / lib32 nel makefile. Gli oggetti sono costruiti in 32 bit bene. L'ultimo passo è collegare tutti gli oggetti e le librerie per X windows in questo eseguibile --- xgap. In qualche modo continua a darmi questo errore:

gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o   -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11  -lSM -lICE

/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...

/usr/bin/ld: i386 architecture of input file 'xcmds.o' is incompatible with i386:x86-64 output
...

Ho installato ia32-libs e supporto mutilib . Penso che ho solo bisogno di forzare il linker per generare un output i386. Ho provato a inserire due flag ld nel mio comando gcc come mostrato sopra: -melf_i386 e -oformat elf32-i386 . Ma quello che succede è che gcc non cerca più la libreria a 32 bit in / usr / lib32 . Mi chiedo se devo mettere quelle bandiere in ordine fisso?

Grazie per qualsiasi idea e aiuto!

EDIT: quando aggiungo il flag -m32 nel mio ultimo comando gcc (lo stage di collegamento credo), anche se ho il flag -L / usr / lib32 in posizione, gcc non cerca in / usr / lib32 più (davvero strano ...) e genera il seguente errore:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status

Qualcuno ha qualche idea del perché questo accada? Sto usando lo strumento automatico per configurare e realizzare. Sono davvero bravo a modificare quei file di script.

EIDT : ho risolto il problema. Penso che gcc si aspettasse un archivio di librerie statiche. Ho usato lo getlibs script da link per scaricare tutti gli archivi .a necessari per il collegamento . Quindi gcc ha funzionato. Penso che gcc abbia eseguito la ricerca nella directory / usr / lib32 ma non abbia trovato gli .a archivi, quindi è andato a cercare nella directory standard che è / usr / lib , dove trova i file incompatibili *. so .

Ma la domanda è: i file *. so in / usr / lib32 / dal pacchetto ia32-libs in realtà non hanno le librerie necessarie per il collegamento? Per cosa sono usati quei file in / usr / lib32 / ?

    
posta Rich 07.12.2011 - 20:53

2 risposte

13

LDFLAGS dovrebbe includere anche -m32 . Di seguito dovrebbe funzionare:

export LDFLAGS='-m32 -L/usr/lib32'

In effetti, puoi eliminare -L/usr/lib32 part, poiché questa è una directory predefinita per le librerie a 32 bit e il tuo sistema ne è a conoscenza.

Fondamentalmente, il modo più semplice per creare applicazioni a 32 bit su macchine a 64 bit è:

export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make

.. o feed quelle variabili per configurare lo script se stai utilizzando gli autotools.

UPDATE:

Sembra che tu non abbia molta familiarità con le differenze nel collegamento con le librerie statiche e dinamiche. Cercherò di essere il più minimale possibile:

  • Sia le librerie di sviluppo statiche che quelle dinamiche hanno la stessa estensione di file .a
  • Se hai installato sia versioni statiche che dinamiche della stessa libreria, una di queste potrebbe avere postfix aggiuntivo, come libname.a per dynamic e libname_s.a per versione statica.
  • Certo, le versioni di librerie statiche e dinamiche differiscono per dimensioni. La versione statica è più pesante.
  • Se si collega alla libreria statica, l'applicazione non ha dipendenze. Se si collega alla libreria dinamica, si baserà sulla libreria di runtime .so che dovrebbe essere presente nel sistema.

Nota, non stiamo parlando di trucchi avanzati qui, come il caricamento esplicito dei DSO che utilizzano l'API dlopen () / dlsym ().

    
risposta data Andrejs Cainikovs 07.12.2011 - 20:59
6

Stavo ricevendo errori come:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++

Questo l'ha risolto per me:

sudo apt-get install g++-multilib

se utilizzi un pacchetto gcc diverso da quello predefinito (ad esempio gcc-7 ), dovrai installare il pacchetto per quella versione specifica:

sudo apt-get install g++-7-multilib
    
risposta data Vladimir Panteleev 28.06.2014 - 14:33

Leggi altre domande sui tag