Como saber se uma biblioteca ARM (.so) é compatível com o PI framboesa

8

Eu tenho uma biblioteca compilada (sem fonte) para um driver de impressão digital. Tenho certeza de que é uma compilação do ARM porque o comando file mylib.sodiz:

Objeto compartilhado ELF de 32 bits LSF, ARM, versão 1 (SYSV), vinculado dinamicamente, sem remoção

mas se eu quiser usá-los em um programa C ++, sempre tenho o mesmo erro:

erro ao carregar bibliotecas compartilhadas: mylib.so: não é possível abrir o arquivo de objeto compartilhado: Esse arquivo ou diretório não existe

esse erro, como você vê, não é muito explícito, é claro que usei o comando export na variável LD_LIBRARY_PATH com o caminho do mylib.so.

Então, como saber se uma biblioteca ARM (.so) é compatível com o PI de framboesa?

- Editar -

ldd libsgfdu03.so:
not a dynamic executable

ldd libsgfdu04.so:
not a dynamic executable

ldd libsgfpamx.so:
not a dynamic executable

No SDK, com o .so, eu tenho um programa C ++ de amostra para gerenciar o driver. Com dois comandos para compilar em um makefile:

g++ -I./ -I../include -c main.cpp -> inclua um arquivo chamado "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

Todos os caminhos são bons e nenhum erro é relatado no momento da compilação, mas depois lddno executável final ldd sgfplibtest_fdu03diz:

    /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)

- Edite o mesmo driver com o 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)

O mesmo exe (mas compilado para x86) não parece exigir mais nada. Estou totalmente perdido ....

Gilles Grandguillaume
fonte
Pode estar dependendo de algo que não está instalado. Corra ldd mylib.soe veja o que sai
Lawrence
ldd mylib.so diz "não é um executável dinâmico" :(
Gilles Grandguillaume
"não é um executável dinâmico" == Acho que você está sem sorte. ldd é uma boa maneira de dizer. Observe que não há apenas uma arquitetura ARM - o pi é ARM11, também conhecido como. ARMv6 e existe um ARMv7 (Cortex) que não é compatível. Eu não conheço uma maneira fácil de diferenciar os executáveis.
goldilocks
é o inverso. o driver é para ARM9, acho que alguns programas para ARM9 são compatíveis com ARM11. mas no meu caso ... não parece :(.
Gilles Grandguillaume

Respostas:

4

Tente ldd foo.soe veja se há alguma saída razoável. Se você receber "aviso: você não tem permissão de execução", é porque os arquivos .so devem ser executáveis ;).

Além disso, não sei se existe uma maneira simples de verificar um .so quanto à compatibilidade do sistema, mas duvido que você receba o erro "Não encontrado" - acho que realmente não consegue encontrá-lo (também acho que há é um erro "formato de arquivo não reconhecido" mais apropriado e, de fato, o vinculador pode não reconhecer esse problema para começar). Portanto, apenas para ter certeza de que estamos na mesma página:

  • Crie um link simbólico no mesmo diretório, ln -s foo.so libfoo.so.1- mais tarde é o que o ld estará procurando.

  • Agora compile um programa de teste g++ -L/directory/path test.cpp -lfoo.

Ainda diz "Não existe esse arquivo ou diretório"?

Saída WRT ldd, se você obtiver coisas assim:

libsgfpamx.so => not found

Indica que o .so está vinculado a outro .so que não pode ser encontrado no caminho da biblioteca e, portanto, provavelmente não está instalado. Se houver motivos para acreditar que esta é uma biblioteca comum que deve estar disponível - por exemplo. pthreads - você pode procurar no repositório raspbian por pacotes que contenham esse arquivo:

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

Agora sabemos que existem vários pacotes com esse nome de arquivo (libc6-dev e libc6: armhf). Claro que o pthreads já está instalado de qualquer maneira. Voltando ao seu problema real:

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

Implicando fortemente que estamos sem sorte WRT um pacote raspbian.

A pesquisa online de "libsgfpamx.so" e "sgfpamx" não retorna ... nada. Quase certamente essas são coisas esotéricas ou internas que foram construídas junto e mylib.so, se você já as tiver em algum lugar, está com sorte; caso contrário, terá que consultar as pessoas responsáveis ​​por "mylib.so".

Cachinhos Dourados
fonte
Eu editei minha pergunta.
Gilles Grandguillaume
@GillesGrandguillaume: adicionei ao final da minha resposta em resposta.
goldilocks
então eu não entendo por que o mesmo código de exemplo funciona no debian ... com a mesma resposta do comando "dpkg -S libsgfpamx.so". Eu editei minha pergunta. desculpe por desperdiçar seu tempo.
Gilles Grandguillaume
-2

As bibliotecas libsg são bibliotecas Secugen. Você precisará obter um SDK e reconstruí-lo para sua plataforma.

jeff
fonte