Wie man erkennt, ob eine ARM-Bibliothek (.so) mit dem Himbeer-PI kompatibel ist

8

Ich habe eine kompilierte Bibliothek (ohne Quelle) für einen Fingerabdrucktreiber. Ich bin sicher, dass es sich um eine ARM-Kompilierung handelt, da der Befehl file mylib.solautet:

Gemeinsames ELF 32-Bit-LSB-Objekt, ARM, Version 1 (SYSV), dynamisch verknüpft, nicht entfernt

aber wenn ich sie in einem C ++ - Programm verwenden möchte, habe ich immer den gleichen Fehler:

Fehler beim Laden von gemeinsam genutzten Bibliotheken: mylib.so: freigegebene Objektdatei kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis

Wie Sie sehen, ist dieser Fehler nicht sehr explizit. Natürlich habe ich den Exportbefehl für die Variable LD_LIBRARY_PATH mit dem Pfad von mylib.so verwendet.

Woher wissen Sie, ob eine ARM-Bibliothek (.so) mit dem Himbeer-PI kompatibel ist?

- Bearbeiten -

ldd libsgfdu03.so:
not a dynamic executable

ldd libsgfdu04.so:
not a dynamic executable

ldd libsgfpamx.so:
not a dynamic executable

Im SDK habe .soich mit dem ein C ++ - Beispielprogramm zur Verwaltung des Treibers. Mit zwei Befehlen zum Kompilieren in einem Makefile:

g++ -I./ -I../include -c main.cpp -> füge eine Datei mit dem Namen "sgfplib.h" hinzu

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

Alle Pfade sind gut und es wird kein Fehler beim Kompilieren gemeldet, aber nach lddder endgültigen ausführbaren Datei ldd sgfplibtest_fdu03heißt es:

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

- Bearbeiten Sie den gleichen Treiber mit 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)

Dieselbe Exe (aber für x86 kompiliert) scheint nichts mehr zu erfordern. Ich bin total verloren ....

Gilles Grandguillaume
quelle
Dies kann von etwas abhängen, das nicht installiert ist. Laufen Sie ldd mylib.sound sehen Sie, was herauskommt
Lawrence
ldd mylib.so sagen "keine dynamische ausführbare Datei" :(
Gilles Grandguillaume
"keine dynamische ausführbare Datei" == Ich denke, Sie haben kein Glück. ldd ist eine gute Möglichkeit zu sagen. Beachten Sie, dass es nicht nur eine ARM-Architektur gibt - der pi ist ARM11, auch bekannt als. ARMv6, und es gibt ein ARMv7 (Cortex), das nicht kompatibel ist. Ich kenne jedoch keine einfache Möglichkeit, die ausführbaren Dateien voneinander zu unterscheiden.
Goldlöckchen
Es ist das Gegenteil. Der Treiber ist für ARM9. Ich denke, einige Programme für ARM9 sind mit ARM11 kompatibel. aber in meinem Fall ... scheinen nicht :(.
Gilles Grandguillaume

Antworten:

4

Versuchen Sie ldd foo.soherauszufinden, ob eine vernünftige Ausgabe vorliegt. Wenn Sie "Warnung: Sie haben keine Ausführungsberechtigung" erhalten, liegt dies daran, dass .so-Dateien ausführbar sein sollen ;).

Darüber hinaus weiß ich nicht, ob es eine einfache Möglichkeit gibt, eine .so auf Systemkompatibilität zu überprüfen, aber ich bezweifle, dass der Fehler "Nicht gefunden" angezeigt wird - ich denke, er kann ihn wirklich nicht finden (ich denke auch dort) ist ein geeigneterer Fehler "Dateiformat nicht erkannt", und tatsächlich erkennt der Linker ein solches Problem möglicherweise zunächst nicht. Nur um sicherzugehen, dass wir damit auf derselben Seite sind:

  • Erstellen Sie einen Symlink im selben Verzeichnis. ln -s foo.so libfoo.so.1Letzteres ist das, wonach ld suchen wird.

  • Kompilieren Sie nun ein Testprogramm g++ -L/directory/path test.cpp -lfoo.

Sagt es immer noch "Keine solche Datei oder kein solches Verzeichnis"?

WRT ldd Ausgabe, wenn Sie solche Sachen bekommen:

libsgfpamx.so => not found

Es zeigt an, dass die .so mit einer anderen .so verknüpft ist, die nicht im Bibliothekspfad gefunden werden kann und daher wahrscheinlich nicht installiert ist. Wenn Grund zu der Annahme besteht, dass dies eine gemeinsame Bibliothek ist, die verfügbar sein sollte - z. pthreads - Sie können das Raspbian-Repository nach Paketen durchsuchen, die diese Datei enthalten:

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

Jetzt wissen wir, dass es mehrere Pakete mit einem solchen Dateinamen gibt (libc6-dev und libc6: armhf). Natürlich ist pthreads sowieso schon installiert. Zurück zu Ihrem eigentlichen Problem:

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

Stark impliziert, dass wir kein Glück haben WRT ein Raspbian-Paket.

Die Online-Suche nach "libsgfpamx.so" und "sgfpamx" gibt ... nichts zurück. Mit ziemlicher Sicherheit handelt es sich um esoterische oder interne Dinge, die zusammen mit gebaut wurden mylib.so, und wenn Sie sie bereits irgendwo haben, haben Sie Glück, sonst müssen Sie sich bei den Verantwortlichen für "mylib.so" erkundigen.

Goldlöckchen
quelle
Ich habe meine Frage bearbeitet.
Gilles Grandguillaume
@ GillesGrandguillaume: Ich habe am Ende meiner Antwort als Antwort hinzugefügt.
Goldlöckchen
Ich verstehe also nicht, warum der gleiche Beispielcode auf Debian funktioniert ... mit der gleichen Antwort des Befehls "dpkg -S libsgfpamx.so". Ich habe meine Frage bearbeitet. Entschuldigung für die Zeitverschwendung.
Gilles Grandguillaume
-2

Die libsg libs sind Secugen libs. Sie müssen ein SDK erwerben und es für Ihre Plattform neu erstellen.

Jeff
quelle