Anzeige:
Ergebnis 1 bis 5 von 5

Thema: stdout Umleitung mit GCC

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Also eine Ausgabe leitet man anders um. Schließe den Filedescriptor 1 und öffne (nach 1) die serielle Schnittstelle. Siehe:

    Code:
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <fcntl.h>
    
    int main() {
    	if (close(1) != 0) {
    		perror("close(1)");
    		return EXIT_FAILURE;
    	}
    
    	int fd = open("/dev/pts/0", O_WRONLY);
    
    	if (fd == -1) {
    		perror("open(\"/dev/pts/0\", O_WRONLY)");
    		return EXIT_FAILURE;
    	}
    
    	if (fd != 1) {
    		fprintf(stderr, "wasn't opened as 1 (stdout) but as %d\n", fd);
    	}
    
    	// now all output to stdout is in fact written to /dev/pts/0
    	printf("this should be on /dev/pts/%d\n", 0);
    	puts("this as well");
    	write(1, "and this", 8);
    	fputc('\n', stdout);
    
    	return EXIT_SUCCESS;
    }
    Hier habe ich das erste virtuelle Terminal statt der Seriellen Schnittstelle geöffnet (ich hab denk ich gar keine mehr, will nicht hinter den PC kriechen, jedenfalls finde ich nix passendes in /dev und ich könnt so das Prog. auch nicht testen, hab nix das den Output der Schnittstelle ließt).
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  2. #2
    Registrierter Benutzer
    Registriert seit
    21.06.2003
    Beiträge
    15
    Das Linken der Libraries funktioniert jetzt. Neben der Auswahl der korrekten libc und libgcc mit Soft Float und war der zum Compilieren der Anwedung passende Schalter -mfloat-abi=soft bzw. -msoft-float das Zauberwort weil dies bei GCC offensichtlich kein default ist.

    @panzi: das Zielsystem ist kein Linux sondern hat gar nichts drauf. GCC wird also als Crosscompiler genutzt und es gibt kein Filesystem weshalb ich gar nicht auf die Idee gekommen im Verzeichnis /dev nach einer passenden tty zu suchen. Im Endeffekt möchte ich eben die formatierte Ausgabe mit printf nutzen und deshalb war Idee dem Compiler ein eigenes putchar unterzuschieben was weis wie auf die (zuvor initialisierte) Schnittstelle (oder LCD Display) ein Zeichen geschrieben wird.

    Momentan sieht es so aus, dass printf das selbst geschriebene putchar leider nicht aufruft, sondern stattdessen in der Lib bei _isatty auf einen Software Breakpoint Befehl aufläuft. Woher soll die Lib auch wissen, wie tty auf diesem System angesprochen wird?

    Ein anderer Lösungsansatz wäre wohl sprintf um den Speicher dann mit einer ganz anderen selbstgemachten Funktion an die HW rauszuschreiben. Das mit dem übersetzen einer eigenen Lib scheint wohl eine größere Sache. Wenn ich das richtig verstanden habe, enthält libgcc den Teil der Laufzeitbibliothke welcher unbedingt mit der gleichen Version des GCC übersetzt werden muss, während libc auch mit älteren GCC übersetzt sein darf.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •