ASN.1 Einsteigerprobleme (für C/C++)



  • Hallo Leute,

    kennt sich jemand von euch mit ASN.1 aus? Bin schon etwas am verzweifeln, da ich für eine C++ Anwendung ASN.1 benötige, aber nicht weiß wie ich es umsetzen soll. Ich programmiere unter Linux (Debian) mit Eclipse CDT und bin was Programmierung angeht auch noch nicht lage dabei.

    Ich versuche mich aktuell an "asn1c" (http://lionet.info/). Ich kann damit ASN1-Strukturen in C-Code umwandeln und diese auch befüllen. Allerdings bekomme ich beim Kompilieren ein "undefined reference" Fehler und ich vermute der Linker braucht noch eine Lib oder ähnliches, nur finde ich keine Lib... 😞
    ...hatte bereits hier gepostet (https://sourceforge.net/p/asn1c/support-requests/24/)

    Prinzipiell geht es um einfache Strukturen wie:

    MyAsnModule
        {1 2 3 4} --irgendeine OID
        DEFINITIONS AUTOMATIC TAGS ::=
    BEGIN
    
    MyStruct ::= SEQUENCE {
        valueA INTEGER,
        valueB OCTET STRING,
        valueC SET OF AlgorithmIdentifier 
    }
    
    AlgorithmIdentifier ::= SEQUENCE {
        algorithm OBJECT IDENTIFIER,
        parameters ANY DEFINED BY algorithm OPTIONAL
    }
    
    END
    

    Diese will ich befüllen und BER/DER kodieren. ...und später natürlich wieder dekodieren und auslesen.

    Eine andere Möglichkeit wäre wohl OpenSSL, aber da weiß ich nicht wie ich es einsetze. Ich finde einfach keine Beispielcodes oder Tutorials dafür 😞
    Kennt jemand etwas Anfängerfreundliches? Irgendetwas, was mir den Einstieg erleichtern könnte?

    viele Grüße,
    SBond



  • Welche Funktionen findet der Linker denn nicht?



  • Ich habe mich zuerst auf ein einfaches Beispiel konzentriert, welches auch in der Dokumentation (http://lionet.info/) aufgeführt ist.

    Hier mal kurz Schritt-für-Schritt was ich gemacht habe:
    Ich habe unter Linux (Debian) zunächst mal den asn1c-Compiler wie folgt installiert:

    tar xfz asn1c-0.9.27.tar.gz
    cd asn1c-0.9.27
    ./configure
    make
    make install
    

    Danach habe ich wie im Beispiel eine Datei mit dem Namen rectangle.asn1 angelegt und folgenden Inhalt eingefügt:

    RectangleModule1 DEFINITIONS ::= BEGIN
       Rectangle ::= SEQUENCE {
       height INTEGER,
       width INTEGER
    }
    END
    

    danach konnte ich diese Datei durch einen Befehl im Terminal wie folgt Kompilieren:

    asn1c rectangle.asn1
    

    Als Ergebnis erhalte ich eine Rectangle.h, eine Rectangle.c und viele weitere .c und .h Dateien, die für die Kodierung verwendet werden. Nun habe ich unter Eclipse CDT ein neues C++ Projekt erstellt und den Pfad zu den generierten Dateien hinzugefügt. Danach habe ich eine main.cpp erstellt mit folgenden Inhalt:

    #include <Rectangle.h>
    
    int main() 
    {
        Rectangle_t *rect = NULL;
        asn_DEF_Rectangle.free_struct(&asn_DEF_Rectangle, rect, 0);
    
        /* hier kommt später mehr */
    
        return 0;
    }
    

    Beim Kompilieren des Programms erhalte ich immer einen Fehler.
    Eclipse-Ausgabe:

    make all 
    Building file: ../src/ASN1.cpp
    Invoking: GCC C++ Compiler
    g++ -I/root/Dokumente -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/ASN1.d" -MT"src/ASN1.d" -o "src/ASN1.o" "../src/ASN1.cpp"
    Finished building: ../src/ASN1.cpp
    
    Building target: ASN1
    Invoking: GCC C++ Linker
    g++  -o "ASN1"  ./src/ASN1.o   
    makefile:45: recipe for target 'ASN1' failed
    ./src/ASN1.o: In function `main':
    /media/sf_NTS_Daten/Workspace/ASN1/Debug/../src/ASN1.cpp:6: undefined reference to `asn_DEF_Rectangle'
    /media/sf_NTS_Daten/Workspace/ASN1/Debug/../src/ASN1.cpp:6: undefined reference to `asn_DEF_Rectangle'
    collect2: error: ld returned 1 exit status
    make: *** [ASN1] Error 1
    

    Ein undefined reference to `asn_DEF_Rectangle' Fehler. Ich denke, dass dem Linker etwas fehlt. ...z.B. eine Bibliothek. Aber ich finde keine und auch im Internet werde ich dazu nicht fündig. Egal welche Beispiele ich verwende oder ASN1-Strukturen, es endet immer mit einem "undefined reference to 'asn_DEF_...'" Fehler.

    Möglicherweise wäre OpenSSL eine alternative, aber da komme ich noch gar nicht klar (zumindest was ASN1 angeht). Der asn1c-Compiler macht ein guten EIndruck, aber ich weiß einfach nicht, was ich falsch mache. 😞

    Achja: hier kann man die asn1-Strukturen auch online kompilieren: (http://lionet.info/asn1c/asn1c.cgi). Da sind dann auch alle c. und h. Dateien enthalten



  • Möglicherweise wäre OpenSSL eine alternative

    das ist aber kein Strukture<->Bytestream konverter - sondern eine geschütze Verbindung zum transport selbiger

    eine alternative wäre eher

    https://developers.google.com/protocol-buffers/

    aber du solltest besser verstehen was dein Linker will - sonst passiert dir das recht schnell wieder und du stehst genau so im Wald



  • Hallo SBond,

    wenn ich den Online-Compiler auf der von dir geposteten Seite benutze, dann sehe ich bei den Logdateien eine generierte "Makefile.am.sample".
    Schau dir diese mal an. Diese ist für GNU Automake.

    Ich denke, daß du bei einem (neuen) Eclipse-Projekt dann alle generierten C-Dateien zum Projekt hinzufügen mußt.

    Mittels der von Automake erzeugten Datei(en) wirst du wahrscheinlich nur die (generierte) Library zu deinem Projekt (bei den Linkeroptionen) hinzufügen müssen.

    Edit:
    Was mir heute gerade noch ein-/auffällt, ist, daß du C mit C++ mischen willst.
    Solange die Headerdateien nicht C++ kompatibel sind, kann es auch zu Linkerfehlern kommen (Stichwort: Name-Mangling).
    In den Headern müßte

    #ifdef __cplusplus
    export "C" {
    #endif
    
    ...
    
    #ifdef __cplusplus
    }
    #endif
    

    stehen.
    Ansonsten verwende einfach auch als Mainfile eine C-Datei (also ".c" als Endung), damit das komplette Projekt in C ist.



  • vielen Dank für die Tipps 🙂

    Ja das Problem mit dem Mischen von C und C++ ist mir auch aufgefallen.
    Mit der Konsole habe ich es heute Nacht geschafft mein Beispiel zu kompilieren:

    rm ./converter-sample.c
    rm ./Makefile.am.sample
    gcc -I. *.c -c
    g++ -I. *.cpp -c
    g++ -I. -o programm *.o
    ./programm
    

    Unter Eclipse kam es trotzdem zum Fehler. ...und den habe ich gerade gefunden.
    Ich musste einfach die ganzen .c und .h Dateien im Projektordner kopieren und den Include-Pfad zu den Compiler-Einstellungen hinzufügen. Nun geht es 😃

    ...10 Tage frustriert gesucht und so ein simpler Fehler. Dennoch frage ich mich, warum es außerhalb des Projektordners nicht funktioniert hat, obwohl das Einbinden richtig aussah. Naja egal.
    ach ich freue mich ja gerade so 😃 😃 😃

    nochmals vielen Dank an euch 😃

    Gruß,
    SBond


Log in to reply