2016-04-01 6 views
6

Qualcuno può spiegare la differenza tra le tre architetture? In realtà quando ho costruito un'applicazione a 64 bit in Linux, ho ottenuto un errore di collegamento dicendo:differenza tra i386: x64-32 vs i386 vs i386: x86_64

skipping incompatible library.a when searching for library.a 

Poi ho usato objdump -f su quella biblioteca e ho ottenuto l'output di seguito:

a.o: file format elf32-x86-64 
architecture: i386:x64-32, flags 0x00000011: 
HAS_RELOC, HAS_SYMS 
start address 0x00000000 

SIGNIFICA la libreria è a 32 bit? È questa la ragione per cui sto ricevendo l'errore del linker?

+0

Si noti che le librerie statiche sono generalmente * di gran lunga più problematiche di quanto valgano. Usa le librerie dinamiche, con un '$ {ORIGIN}' -relativo '-rpath' se * hai * veramente * bisogno e non hai bisogno di' setuid' o di qualsiasi altra 'capacità'. – o11c

risposta

8

ci sono 3 comuni ABI Stati Uniti d'America su macchine standard compatibili Intel (non Itanium).

  • La classica architettura a 32 bit, spesso chiamata "x86" in breve, che ha tripli come i[3-6]86-linux-gnu. Registri e puntatori sono entrambi a 32 bit.
  • L'estensione a 64 bit originariamente da AMD, spesso chiamata "amd64" in breve, che ha GNU triplo di x86_64-linux-gnu. Registri e puntatori sono entrambi a 64 bit.
  • Il nuovo ABI "x32", con una tripla di x86_64-linux-gnux32. I registri sono a 64 bit, ma i puntatori sono solo a 32 bit, risparmiando molta memoria nei flussi di lavoro a puntatore. Garantisce inoltre che tutte le altre funzionalità del processore a 64 bit siano disponibili.

Ciascuna interfaccia di cui sopra ha il suo sulla chiamata di sistema, proprio ld.so, proprio insieme completo di librerie, ecc, ma è possibile eseguire tutti e 3 sullo stesso kernel.

Su Linux, i caricatori sono:

% objdump -f /lib/ld-linux.so.2 /lib64/ld-linux-x86-64.so.2 /libx32/ld-linux-x32.so.2 

/lib/ld-linux.so.2:  file format elf32-i386 
architecture: i386, flags 0x00000150: 
HAS_SYMS, DYNAMIC, D_PAGED 
start address 0x00000a90 


/lib64/ld-linux-x86-64.so.2:  file format elf64-x86-64 
architecture: i386:x86-64, flags 0x00000150: 
HAS_SYMS, DYNAMIC, D_PAGED 
start address 0x0000000000000c90 


/libx32/ld-linux-x32.so.2:  file format elf32-x86-64 
architecture: i386:x64-32, flags 0x00000150: 
HAS_SYMS, DYNAMIC, D_PAGED 
start address 0x00000960 

Ora, se stai ricevendo il messaggio di "saltare biblioteca incompatibile", che significa qualcosa è incasinato con la configurazione. Assicurati di non avere variabili negative nell'ambiente o di passare sulla riga di comando, o file installati al di fuori del controllo del gestore pacchetti.

+0

Grazie per le informazioni .. nel mio PC Linux, non sono riuscito a trovare/lib/libx32 a tutti ... è la causa di ciò? –

+0

Questo non è sorprendente, se non hai installato un pacchetto gcc con multilib-enabled, probabilmente non avrai inserito i bit glibc. Naturalmente in quel caso, non sono sicuro di come hai ottenuto la libreria su * all * ... – o11c

+0

@SanthoshKumar probabilmente non hai installato x32 devenv (no libgcc, no glibc, ...). Prova a installare x32 e compila qualcosa di semplice 'gcc -mx32 helloworld.c' –

3

Oltre al normale 64 bit pieno e al buon vecchio ABI a 32 bit, c'è uno speciale ABI (ispirato all'ambiente SGI n32) dove i puntatori sono a 32 bit (quindi sono applicazioni a 32 bit), ma è progettato per funzionare su host 64 bit e avere accesso completo a tutti i goodies x64:

  • registri x64 nativa e la matematica
  • più registri
  • SSE2/3/4, AVX1/2/...
  • 4GB pieno spazio di indirizzamento a 64 bit su un host

Si chiama x32 ABI, link: https://en.wikipedia.org/wiki/X32_ABI

UPDATE

Il sistema Ubuntu devo installare due pacchetti (con dipendenze) per ottenere x32 di lavoro:

> sudo apt install gcc-multilib 
> sudo apt install libx32stdc++-5-dev 

Poi compilazione simlple C++ codice con g++ -mx32 hellow.cpp opere, rendendo x32 eseguibile

> file a.out 
./a.out: ELF 32-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /libx32/ld-linux-x32.so.2, for GNU/Linux 3.4.0