Aus Linux-Magazin 05/2002

Software entwickeln unter Linux

Die Programmieren-Rubrik steht diesmal im Zeichen von Web-Techniken: eine XML-Datenbank in Java, zwei XML- Parser für Python und ein Perl-CGI-Skript. Sie erfahren auch, wie man Bibliotheksfunktionen austauscht.

Manchmal ist auch “Programmieren” drin, wenn “Know-how” draufsteht: Der Artikel über Transconnect erklärt, wie man bei einem dynamisch gelinkten Binary einzelne Bibliotheksfunktionen austauscht. Der Linker bindet erst alle in der Umgebungsvariablen »LD_PRELOAD« genannten Libraries an das Programm, danach folgen die ursprünglich gelinkten Bibliotheken.

Bei der Suche nach Funktionen findet der Linker die Implementierung in der eingefügten Library. Diese Technik lässt sich für viele Zwecke nutzen; Transconnect ändert mit ihr die »connect()«-Funktion der C-Bibliothek. Mit der neuen Routine nutzen Clients einen HTTP-Proxy und dessen Connect-Methode, ohne es selbst zu bemerken.

Die Quelldatei »tconn.c« enthält eine Ersatzfunktion mit dem gleichen Namen und den gleichen Parametern wie das originale »connect()«:

int connect (int sockfd, const struct
  sockaddr *serv_addr, socklen_t addrlen)

Das Quell-File kann die üblichen Header einbinden und dadurch gewährleisten, dass die Signatur der Funktion tatsächlich stimmt. Der Compiler muss mit den passenden Optionen aufgerufen werden, um aus »tconn.c« die Shared Library »tconn.so« zu erzeugen:

gcc -shared -ldl -o tconn.so tconn.c

Aus der zusätzlichen Bibliothek »dl« holt Transconnect die Funktion »dlsym()«.

Original und Fälschung

»dlsym()« löst ein Problem, mit dem Transconnect sonst zu kämpfen hätte: »tconn.so« ersetzt die »connect()«-Funktion, braucht das Original aber selbst, um sich mit dem Proxy zu verbinden. Dazu nutzt es den Funktionszeiger

static int (*func) ();

den es mit Hilfe von »dlsym()« auf die Adresse der Originalfunktion biegt. Dlsym durchsucht dazu alle gelinkten Bibliotheken nach der nächsten »connect()«-Funktion:

func = (int (*)()) dlsym (
  RTLD_NEXT, "connect");

Mit »dlopen()« kann man sogar explizit festlegen, in welcher Library »dlsym()« die Implementierung der »connect()«-Funktion suchen soll:

static void *handle;
handle = dlopen (
  "/usr/lib/libc.so", RTLD_LAZY);
func = (int (*)()) dlsym (
  handle, "connect");

Der Aufruf »func(…)« springt nun zu exakt jenem Code, der normalerweise für »connect(…)« zuständig ist. Transconnect baut damit die Verbindung zum Proxy auf und schickt ihm den HTTP-Connect-Header mit den Daten des gewünschten Servers. Der Proxy verbindet dann Client und Server.

Programmierer-Software

Versionsnummern der aktuellen stabilen Releases am 12.03. 2002 und Änderungen gegenüber dem Vormonat.

Skriptsprachen

Guile 1.4

NetRexx 2.02

Object Rexx 2.2

Perl 5.6.1

PHP 4.1.2

Python 2.2

Ruby 1.6.7

Tcl 8.3.4

Java

Blackdown 1.3.1-02a

IBM Java2 SDK 1.3-1.0

Jikes 1.15

Kaffee 1.0.6

Sun SDK 1.4.0

Compiler

Binutils 2.11.2

Clisp 2.28

Free Pascal 1.0.4

GCC 3.0.4

GForth 0.5.0

GNU Pascal 2.0

Libraries

FLTK 1.0.11

glibc 2.2.5

glut 3.7

GTK+ 2.0

LessTif 0.93.18

libpng 1.2.1

libsdl 1.2.3

libstdc++ 3.0.97

libxml 2.4.17

Mesa 4.0.1

OpenSSL 0.9.6c

Qt 3.0.2

wxWindows 2.2.9

zlib 1.1.4

Debugger

Checker 0.9.4

Code Medic 1.1.3

DDD 3.3

GDB 5.1.1

Insight 5.1.1

Build-Tools

Autoconf 2.53

Automake 1.6

Compilercache 1.0.10

CVS 1.11.1p1

Libtool 1.4.2

GNU Make 3.79.1

SWIG 1.3.11

IDEs

Anjuta 0.1.9

Code Crusader 3.0.3

C-Forge 2.0

CodeWarrior 6.0

Emacs 21.1

KDevelop 2.0.2

Kylix 2.0

Motor 3.2.0

SNiFF+ 4.0.2

Source-Navigator 5.0

VIM 6.0

XEmacs 21.1.14

XWPE 1.5.26a

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben