Come sapere se una libreria ARM (.so) è compatibile con il Raspberry PI


9

Ho una libreria compilata (senza sorgente) per un driver di impronte digitali. Sono sicuro che sia una compilation ARM perché il comando file mylib.sodice:

Oggetto condiviso LSB a 32 bit ELF, ARM, versione 1 (SYSV), collegato dinamicamente, non rimosso

ma se voglio usarli in un programma C ++ ho sempre lo stesso errore:

errore durante il caricamento delle librerie condivise: mylib.so: impossibile aprire il file oggetto condiviso: nessun file o directory

questo errore come vedi non è molto esplicito, ovviamente ho usato il comando export sulla variabile LD_LIBRARY_PATH con il percorso di mylib.so.

quindi, come sapere se una libreria ARM (.so) è compatibile con il Raspberry PI?

-- Modificare --

ldd libsgfdu03.so:
not a dynamic executable

ldd libsgfdu04.so:
not a dynamic executable

ldd libsgfpamx.so:
not a dynamic executable

Nell'SDK, con .so, ho un programma C ++ di esempio per gestire il driver. Con due comandi per la compilazione in un makefile:

g++ -I./ -I../include -c main.cpp -> include un file chiamato "sgfplib.h"

g++ /usr/lib/arm-linux-gnueabihf/libusb.so -lpthread -lsgfpamx -lsgfdu03 -lsgfplib -o ../bin/arm12/sgfplibtest_fdu03 main.o -L/home/pi/sdk/lib/arm12

Tutti i percorsi sono buoni e nessun errore viene segnalato al momento della compilazione, ma dopo lddl'eseguibile finale ldd sgfplibtest_fdu03dice:

    /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0xb6f76000)
    libusb-0.1.so.4 => /lib/arm-linux-gnueabihf/libusb-0.1.so.4 (0xb6f5a000)
    libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6f3b000)
    libsgfpamx.so => not found
    libsgfdu04.so => not found
    libsgfplib.so => not found
    libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0xb6e6e000)
    libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6dfd000)
    libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xb6dd5000)
    libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6ca6000)
    /lib/ld-linux-armhf.so.3 (0xb6f83000)

- Modifica lo stesso driver con debian x86 -

dpkg -S libsgfpamx.so 

dpkg-query: no path found matching pattern *libsgfpamx.so*

ldd sgfplibtest_fdu03 :

    linux-gate.so.1 =>  (0xb76eb000)
    libusb-0.1.so.4 => /lib/libusb-0.1.so.4 (0xb76d1000)
    libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb76b8000)
    libsgfpamx.so => /usr/local/lib/libsgfpamx.so (0xb769d000)
    libsgfdu03.so => /usr/local/lib/libsgfdu03.so (0xb7632000)
    libsgfplib.so => /usr/local/lib/libsgfplib.so (0xb7623000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7536000)
    libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7510000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb74f1000)
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb73aa000)
    /lib/ld-linux.so.2 (0xb76ec000)

Lo stesso exe (ma compilato per x86) non sembra richiedere altro. Sono totalmente perso ....


Potrebbe dipendere da qualcosa che non è installato. Corri ldd mylib.soe guarda cosa viene fuori
— Lawrence,

ldd mylib.so dire "non un eseguibile dinamico" :(
— Gilles Grandguillaume,

"non un eseguibile dinamico" == Penso che tu sia sfortunato. ldd è un buon modo di dire. Nota che non esiste una sola architettura ARM: il pi è ARM11, aka. ARMv6 e c'è un ARMv7 (Cortex) che non è compatibile. Non conosco un modo semplice per distinguere gli eseguibili.
— riccioli d'oro

è il contrario. Il driver è per ARM9, immagino che alcuni programmi per ARM9 siano compatibili con ARM11. ma nel mio caso ... sembra di no :(.
— Gilles Grandguillaume

Risposte:


4

Prova a ldd foo.sovedere se c'è qualche risultato ragionevole. Se ricevi "avviso: non hai i permessi di esecuzione" è perché i file .so dovrebbero essere eseguibili ;).

Oltre a ciò, non so se esiste un modo semplice per controllare un .so per la compatibilità del sistema, ma dubito che otterresti l'errore "Non trovato" - Penso che davvero non riesca a trovarlo (penso anche lì è un errore "formato file non riconosciuto" più appropriato, e in effetti il ​​linker potrebbe non riconoscere un tale problema per cominciare). Quindi, per essere sicuri che siamo sulla stessa pagina con quello:

  • Crea un collegamento simbolico nella stessa directory, ln -s foo.so libfoo.so.1- più tardi è quello che cercherò ld.

  • Ora compila un programma di test g++ -L/directory/path test.cpp -lfoo.

Dice ancora "Nessun file o directory"?

WRT ldd output, se ottieni cose come questa:

libsgfpamx.so => not found

Indica che .so è collegato ad un altro .so che non può essere trovato nel percorso della libreria e quindi probabilmente non è installato. Se c'è motivo di credere che questa sia una libreria comune che dovrebbe essere disponibile - ad es. pthreads - è possibile cercare nel repository raspbian i pacchetti contenenti quel file:

> dpkg -S libpthread.so
libc6-dev:armhf: /usr/lib/arm-linux-gnueabihf/libpthread.so
libc6:armhf: /lib/arm-linux-gnueabihf/libpthread.so.0

Ora sappiamo che ci sono diversi pacchetti con un tale nome di file (libc6-dev e libc6: armhf). Ovviamente pthreads è già installato comunque. Tornando al tuo problema reale:

dpkg -S libsgfpamx.so
dpkg-query: no path found matching pattern *libsgfpamx.so*

Sottolineando fortemente che siamo sfortunati WRT un pacchetto raspbian.

La ricerca online di "libsgfpamx.so" e "sgfpamx" non restituisce ... nulla. Quasi sicuramente si tratta di cose esoteriche o interne che sono state costruite insieme mylib.soe, se le hai già da qualche parte, sei fortunato, altrimenti dovrai informarti con le persone responsabili di "mylib.so".


ho modificato la mia domanda.
— Gilles Grandguillaume,

@GillesGrandguillaume: ho aggiunto alla fine della mia risposta in risposta.
— riccioli d'oro

quindi non capisco perché lo stesso codice di esempio funzioni su debian ... con la stessa risposta del comando "dpkg -S libsgfpamx.so". Ho modificato la mia domanda. scusa per aver perso tempo.
— Gilles Grandguillaume,

-2

Le librerie libsg sono librerie Secugen. Dovrai ottenere un SDK e ricostruirlo per la tua piattaforma.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.