2010-10-29 2 views
10

Sull'host a 64 bit sto provando a creare librerie condivise con l'opzione -m32. È possibile che queste librerie siano collegate con normali librerie a 64 bit?GCC -m32 flag:/usr/bin/ld: saltando incompatibile

sto facendo qualcosa di simile:

g++ -m32 -shared source.cpp -l 64_bit_library.so -o 32_bit_library.so 

e ottenere messaggi di errore come questo:

/usr/bin/ld: skipping incompatible 64_bit_library.so 

Quindi la mia domanda è: come 64_bit_library.so e 32_bit_library.so deve essere compilato su host a 64 bit, a rendere possibile che 32_bit_library.so sia collegato a 64_bit_library.so?

risposta

11

Non è possibile collegare applicazioni a 32 bit a 64 bit e viceversa. Il problema è che i puntatori e i tipi in generale non possono essere passati tra di loro. Normalmente la soluzione alternativa consiste nello spawnare un processo secondario delle altre dimensioni e utilizzare IPC per comunicare con quel processo.

pensare in questo modo: se ho una funzione banale C:

extern void foo(void*); 

Se è in una libreria a 64 bit e io cerco e lo chiamano da una libreria a 32 bit in cui si fa l'altra metà del puntatore venire a partire dal?

Al contrario se si trova in una libreria a 32 bit e io lo chiamo da un'applicazione a 64 bit cosa succede all'altra metà del puntatore che dovrei perdere per chiamarla?

+0

Se sei stato davvero attento, potresti essere in grado di riprodurre alcuni giochi con typedef, mmap con il flag MAP_32BIT e segmenti di memoria condivisa, ma è un sacco di problemi! – Flexo

+0

puoi dire in ogni caso come controllare che sia incompatibile? usando forse forse? - http://rzr.online.fr/q/gcc – RzR

+0

@rzr - Il modo più semplice per controllare sarebbe semplicemente utilizzare il comando 'file' sull'oggetto condiviso e vedere se corrisponde a quello che stai provando fare con gcc. Si può lavorare con 'readelf -h' o' objdump -x', anche se per esempio, ma trovo che l'output di 'file' sia più conciso. – Flexo