Login
Login-Name Passwort


 
Newsletter
Werbung

So, 23. Februar 2003, 00:00

C++ nur mit libc

Kaum ein Programmierer wird, sofern auf objektorientierte Programmierung angesprochen, verneinen, daß damit beträchtliche Vorteile einhergehen, wie z.B. Steigerung der Produktivität, Verringerung der Komplexität usw. Nicht alle Programmierprojekte nutzen aber objektorientierte Programmiersprachen wie z.B. C++, sondern verwenden ANSI-C aus Gründen, die hier nicht näher erörtert werden sollen, wollen aber auf OO-Vorteile nicht verzichten und basteln sich daher ihr eigenes objektorientiertes Framework, so geschehen z.B. im Open-Source Projekt GNOME.

Da ich selbst auf die Vorteile einer objektorientierten Programmiersprache wie C++ nicht verzichten möchte, es aus Gründen der Ladezeit und Portabilität manchmal aber von Vorteil ist, nur rein auf die C-Bibliothek (libc) aufzusetzen, möchte ich an dieser Stelle erläutern, wie ein mit Hilfe des GNU C++ Compilers (Version 3.2) zu erstellendes C++ Programm so angepaßt werden kann, daß dies nur mit der libc-Bibliothek auskommt. Im folgenden beziehe ich mich daher nur auf den GNU-Compiler (gcc/g++).

Normalerweise wird ein C++-Programm mit g++ übersetzt und gelinkt. Dabei wird es standardmäßig mit den folgenden Bibliotheken zusammengebunden:

libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x40020000)
libm.so.6 => /lib/libm.so.6 (0x400d3000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x400f6000)
libc.so.6 => /lib/libc.so.6 (0x400fe000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Mit dem Befehl "ldd" können Sie selbst überprüfen, auf welche Bibliotheken eine von Ihnen verwendete Applikation zurückgreift.

Ein C-Programm dagegen wird standardmäßig nur mit folgenden Bibliotheken zusammengebunden:

libc.so.6 => /lib/libc.so.6 (0x40020000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Um dies auch für ein C++-Programm zu erreichen, sind wir gezwungen, auf zwei "C++-Features" zu verzichten. Das sind erstens C++-Exception-Handling und zweitens die Runtime-Type-Information, kurz rtti. Dies erzwingen wir durch Verwendung der Kommandozeilenoptionen:

-fno-rtti -fno-exceptions

Verwenden Sie in Ihrem Projekt eines dieser Features, so wird der Compiler dies mit einer Fehlermeldung quittieren.

Aller guten Dinge sind drei! Und deshalb muß drittens zusätzlich noch folgende Funktion in ihr C++-Projekt aufgenommen werden:

#include <stdlib.h>
#include <stdio.h>
extern "C" void __cxa_pure_virtual ()
{
	printf ("Call of pure virtual function\n") ;
	exit (1) ;
}

Und zwar deshalb, weil der GNU-Compiler alle rein virtuellen Funktionen (virtual ... () = 0) eines Objektes automatisch diese Funktionen aufrufen läßt, um eine Fehlermeldung auszugeben und das Programm abzubrechen. Obige Funktion enthält daher genau diese Funktionalität.

Beim Linken (Binden) des Programmes kann jetzt entweder gcc verwendet werden oder g++ mit den Optionen

-nodefaultlibs -lc

Zum Test habe ich noch ein kleines C++-Beispielprogramm beigefügt, das virtuelle Funktionen benutzt und mittels

gcc --fno-rtti -fno-exceptions main.cpp

zu "a.out" übersetzt wird. Sie können nun mittels "ldd a.out" überprüfen, ob nur die C-Bibliothek verwendet wird, und das Programm mittels "a.out" starten.

Von nun ab kann man getrost behaupten: "Sei die Macht von GNU C++ auch mit dem GNU C Programmierer."

Kommentare (Insgesamt: 0 || Kommentieren )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung