Ratlos: SIGILL aber Instruction ist ok



  • Hallo,

    Ich versuche derzeit von mir erstellten Native Code auszuführen. Der NC ist total simpel und zählt nur eine Variable nach oben. Es sind demnach auch nur etwa 5 Befehle, welche ich Bit für bit überprüft habe und für meinen PowerPC richtig sein müssten. Ich führe den Code folgendermaßen aus:

    LZSBYTE (*NC_fct)(LZSDWORD, LZSDWORD, LZSDWORD);
    LZSBYTE *AnfNS;
    
    ...
    
    NC_fct = (LZSBYTE(*)()) AnfNS;
    bRetCode = (*NC_fct)((LZSDWORD) pSegTab_l, (LZSDWORD) pAdrDS, (LZSWORD) hChildInst_p);
    

    Wenn ich nun mit dem Debugger einzeln durch den NC Steppe funktioniert das einwandfrei (Also per remotedebugging mit gdb server), wenn ich das Programm aber laufen lasse normal oder auch remote debugge ohne einen Breakpoint zu setzen, bleibt das Programm bei der ersten NC instruction stehen und meldet SIGILL. Wie gesagt bei einzeln durchsteppen funktioniert das ganze problemlos!

    Ich bin total ratlos und weiß nicht wo ich hier einen Fehler suchen soll!

    Grüße,

    m00ni



  • Ist die fehlerhaft arbeitende Variante mit oder ohne Debugcode compiliert?

    Falsches Forum.



  • Sorry wegen dem falschen Forum ich hab irgendwie auf dem ersten Blick in diesem Forum keinen besseren bereich gefunden. Lasse mich aber sehr gerne belehren.

    Also vielleicht um das nochmal deutlich zu machen es gibt 3 varianten:

    1. Debug mit Breakpoint am Anfang der Funktion die den NC aufruft
    Hierbei gibt es bei single stepping überhaupt kein Problem, kann problemlos durch den NC steppen

    2. Debug komplett ohne Breakpoints
    Programm hält an der ersten Instruction des NC und meldet SIGILL. Wenn ich mir die Instruction, Memory, Register etc ankuck scheint aber alles super ok zu sein.

    3. Normaler Start auf dem PowerPC
    Programm terminiert mit SIGILL

    Gedebugged wird immer mit GDBServer



  • Alles Verstanden 👍



  • Wild geraten: Befindet sich der native Code im Codesegment, oder hast du ihn irgendwo in ein Array geschrieben? Bei letzterer Variante dürfte für den betreffenden Speicher das NX-Bit gesetzt sein, und dafür, in derart geschütztem Speicher Code ausführen zu wollen, dürftest du ein SIGILL kriegen.



  • Danke für den Hinweis, ja ich habe das ganze nur im Speicher in einem ganz normalen mit malloc erzeugtem Speicher. Da werde ich mal nachforschen ob das daran liegen könnte. Vielen Dank schonmal für den Hinweis.

    Der Alles Verstandne post ist übrigens nicht von mir... Das hat man davon wenn man zu faul ist sich anzumelden 😃



  • Ich hab es noch nicht ausgiebig getestet, aber was mir bisher aufgefallen ist:

    Der Speicherbereich in dem Code funktioniert und der Speicherbereich in dem mein NC ist der nicht funktioniert unterscheiden sich nur minimal, wäre also unwahrscheinlich, dass gerade bei mir auf einmal die Ausführung verboten wäre. Außerdem erklärt es leider immer noch nicht (selbst wenn ich den code nicht ausführen dürfte wegen falschem mem bereich) warum ich ihn wunderbar ausführen kann wenn ich drüber debugge in single steps.



  • Mac OS X schützt den Heap seit 10.5 mit W^X, wenn ich den Absatz auf Wikipedia richtig lese. Wenn du dynamisch Speicher anforderst und da reinschreibst, kannst du das, was da reingeschrieben wurde, nicht ausführen, unabhängig davon, wie nah es im virtuellen Adressraum am Codesegment ist.

    Warum der Debugger sich anders verhält, darüber kann ich nur spekulieren.



  • Nachtrag: Jetzt unter der Vermutung, dass dein PowerPC MacOS benutzt.



  • Also nochmal danke für den Hinweis er hat mir tatsächlich schon viel weitergeholfen.

    Zum Hintergrund, den NativeCode den ich ausführen möchte wurde aus einem Zwischencode auf dem PowerPC compiliert. Wenn ich den Native Code auf einem PC kompilieren lasse und dann auf den PowerPC übertrage und ausführe hat das schon immer funktioniert.

    Ich habe jetzt den lokal erstellten NC an die Stelle im Speicher geschrieben an der normalerweise der fertige NC vom PC hingeschrieben wird und diesen somit überschrieben und siehe da er wird ordnungsgemäß ausgeführt. Es scheint also tatsächlich an der Speicheradresse zu liegen.

    Ich hab auf dem PowerPC übrigens ein kleines Linux drauf, dass is nur so ein kleiner Mikrokontroller MPC5200. Weiß denn hier zufällig jemand wie ich den kompletten Speicher ausführbar machen kann auf so einem Mikrokontroller? Ich weiß, dass das jetzt erst recht das falsche Forum ist aber vielleicht kann ja trotzdem einer helfen. Entschuldigung shconmal dafür 😃



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum C (C89 und C99) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten