Anfängerprobleme Segfault/Permission denied (Gelöst/solved)



  • Hallo Forum,

    ich versuche dem Howto von
    http://www.int21.de/linux4k/ bzw
    http://users.utu.fi/tmwire/linux4k.html
    zu folgen. Doch leider scheitert es ganz massiv und ich drehe langsam durch.

    Ich habe die compile und linkanweisungen an 64bit anpassen müssen, aber auch auf einem 32bit testrechner klappt es irgendwie nicht.

    mein Makefile sieht so aus:

    test4k: test4k.c
    	gcc -Os -fomit-frame-pointer -ffast-math -nostdlib -c test4k.c
    	ld -dynamic-linker /usr/lib/i386-linux-gnu/libGL.so /lib/ld-linux.so.2 /usr/lib/libSDL.so test4k.o -lGL -o test4k
    
    x64:
    	gcc -m64 -Os -c test4k.c 
    ld -dynamic-linker /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /usr/lib/x86_64-linux-gnu/libSDL.so test4k.o /usr/lib/x86_64-linux-gnu/libGL.so -o test4k
    

    Auf dem 64Bit System (Ubuntu12.04/ 3.2.0-26):
    Um den Fehler weiter einzugrenzen habe ich so ziemlich jeden Quellcode rausgeschmissen, so dass das Programm jetzt nur noch so aussieht:

    #include "GL/gl.h"
    #include "SDL/SDL.h"
    #include "stdio.h"
    #include "sys/soundcard.h"
    #include "fcntl.h"
    #include "sys/ioctl.h"
    #include "unistd.h"
    
    void _start()
    {
    	(void)printf("Hello, World!\n");
    }
    

    Das Kompilieren und Linken läuft so durch, aber beim starten der Anwendung:

    Hello, World!
    Speicherzugriffsfehler (Speicherabzug geschrieben)
    

    Auf dem 32Bit -TestSystem (Ubuntu11.10/ 3.0.0-12):
    Ich wollte es dann auf inem 32bit System gegentesten, hier gibs ein ganz anderes Problem:

    #include <stdio.h>
    void _start()
    {
     (void)printf("Hello, World!\n");
    }
    

    Kompilieren und Linken läuft durch, beim Aufruf dann:

    root@bubu:/home/bubu/test4k# ./test4k 
    -bash: ./test4k: Keine Berechtigung
    

    Das File ist u+x, ich bin root, noexec ist auf der Partition nicht gesetzt(user auch nicht).

    Hat vielleicht jemand einen wegweisenden Tip?
    LG
    SandUhrGucker



  • Aus deinem Konglomerat an Fehlervarianten präsentiere mal eine mit konkretem Quellcode, so wie das hier in den Forumsregeln beschrieben ist.
    Hardwaregefrickel mit irgendwelchen Inline-asm sind auch nicht sonderlich portabel, das sollte dir klar sein. (unter dem Link habe ich Code mit so Zeugs gesehen)



  • Mein Tipp wäre, dass die stdio in _start eventuell noch nicht initialisiert ist und daher printf mehr oder weniger katastrophal fehlschlägt.



  • Wutz schrieb:

    Aus deinem Konglomerat an Fehlervarianten präsentiere mal eine mit konkretem Quellcode, so wie das hier in den Forumsregeln beschrieben ist.
    Hardwaregefrickel mit irgendwelchen Inline-asm sind auch nicht sonderlich portabel, das sollte dir klar sein. (unter dem Link habe ich Code mit so Zeugs gesehen)

    Das ist der konkrete Quellcode. Ich habe alles andere ein-kommentiert - auch den asm code.
    Mir ist klar, das die includes dann auch nicht nötig wären, aber ich schätze das die das Problem nicht lösen.



  • Bashar schrieb:

    Mein Tipp wäre, dass die stdio in _start eventuell noch nicht initialisiert ist und daher printf mehr oder weniger katastrophal fehlschlägt.

    Hmm. Guter Tip, aber wie sollte ich das ändern, ohne auf eine main zu verzichten?



  • "ohne auf eine main zu verzichten" -- aber genau das tust du doch. 😕

    Naja mal angenommen, du meinst das Gegenteil. Dann verwende halt nicht printf, sondern z.B. write. Wer braucht bitte printf in einem 4k-Intro?



  • Für die Nachwelt: Lösung war letztendlich:
    Die Reihenfolge der objekte für LD war ausschlaggebend.

    gcc -Os -fomit-frame-pointer -c test4k.c
    	ld -dynamic-linker /lib/ld-linux.so.2 /usr/lib/libGL.so /usr/lib/libSDL.so test4k.o -o test4k
    

    Und Sinngemäß konnte das nur auf einem Ununtu 8 ausgeführt werden, weil der 4kintro-Code auf oss beruht, und das /dev/dsp voraussetzt, was in höheren Ubuntu-Versionen zugunsten von alsa abgeschafft wurde.

    Vielen Dank für alle Tipgeber! Thread kann gelöst/geschlossen werden.
    LG
    SandUhrGucker


Anmelden zum Antworten