Zeitauskunft (war: Re: [linux-l] Dateien mit '/' im Dateinamen)

Jan-Benedict Glaw jbglaw at lug-owl.de
Fr Aug 1 10:58:11 CEST 2003


On Fri, 2003-08-01 10:16:58 +0200, Steffen Dettmer <steffen at dett.de>
wrote in message <20030801101658.H4390 at dx.net.de>:
> * Jan-Benedict Glaw wrote on Thu, Jul 31, 2003 at 12:56 +0200:
> > On Thu, 2003-07-31 08:55:41 +0200, Steffen Dettmer <steffen at dett.de>
> > wrote in message <20030731085541.F2642 at dx.net.de>:
> > > * Jan-Benedict Glaw wrote on Wed, Jul 30, 2003 at 12:52 +0200:
> > > > Ist vom Prinzip her ganz einfach (ich häng' mal 'was an, mit
> > > > dem ich lib-Aufrufe abfange), funktioniert hier aber nicht, da
> > > > LD_PRELOAD-libs nicht auf setuid-Programme (vmware ist
> > > > sowas!!!) angewandt werden. 
> > > 
> > > Na ja, kriegt man aber systemweit hin.
> > > 
> > > > Für die libc-Funktionen atexit() und on_exit() sieht das z.B. so aus:
> > > 
> > > Versteh ich nicht.
> > 
> > Es gibt zwei Funktionen, um Funktion(spointer) an die libc zu übergeben,
> > die der Reihe nach aufgerufen werden sollen, wenn das Programm exit()
> > aufruft oder via return xx; auf main() herausspringt. Das habe ich als
> > Beispiel gegeben, weil ich's gerade fertig vor mir hatte.
> 
> Schon fertig aus anderem Grund? Ohh... Soll man da nicht
> atexit(3) verwenden? Chaining macht die ja automatisch IIRC.

Ich hatte das Problem, daß ein Datenbank-Client die Datenbank öffnet
(und dabei eine Funktion zum Schließen in die atexit-Tabelle tut) und
dann, bei (kleinen) Fehlern, die Datenbank explizit zumacht und sich
beendet (wobei die DB dann ein 2tes Mal zugemacht wird, was mit SIGSEGV
geahndet wird).

Das mußte irgendwie debugged werden, daher hab' ich die beiden
Funktionen abgefangen:)

> > > >         if(orig_atexit)
> > > >                 return (*orig_atexit)(function);
> > > >         else
> > > >                 return -1;
> > > > }
> > > 
> > > Orginalen at_exit aufrufen.
> > 
> > So.
> 
> Ja, interessanter Weg :) Anstatt sich "hinter" atexit
> einzuklinken, machst Du das vorn. Na ja, aber wohl auch eher zu
> Test/Debugzwecken als in Produktion :)

Volltreffer:)

> > Im Endeffekt brauchst Du nicht viel mehr, als die
> > Funktionsnamen auszutauschen, um time() und gettimeofday() auf
> > diesem Wege abzufangen.
> 
> Die man sich natürlich auch prima statisch linken kann :-) Jo,
> aber klar, hab's dann doch verstanden.

Könnte man. Aber wer macht das? Netterweise kaum jemand:-)

> > > > #define INTERCEPT_TARGET RTLD_NEXT
> > > 
> > > Kennt meine Man-Page nicht.
> > 
> > Tiefes libc-Wissen:)
> 
> Du meinst, unprotabel, ja? :-) Und was heißt das nu?

Es kann durchaus sein, daß ein Symbol ("atexit") mehrfach in mehreren
Libs vorkommt (in diesem Beispiel einmal bei mir und einmal in der
libc). Mit -1 sagst Du (allgemein), daß Du die "nächste" Definition des
Symboles haben möchtest - sonst würde ich hier meine Implementierung
bekommen, und die will ich ja nur einmal aufrufen.

Da es für "Der nächste, bitte!" aber auch ein #define (RTLD_NEXT) geben
kann, versuche ich, das zu benutzen. Gibt's das nicht, versuche ich mich
an einer optimistischen Schätzung.

> > Nicht mehr. In 2.6.x ist sys_call_table nicht mehr EXPORT_SYMBOL()ed
> > sodaß Du darauf (zumindest aus einem Modul heraus) keinen (einfachen)
> > Zugriff bekommst.
> 
> So kann man sich das Tool laden, welches eine Funktion
> bereitstellt, die die Tabelle doch returnt? :-) just kidding -
> aber gibt's bestimmt in diversen Kreisen.

Aber sicher. Die Tabelle gibt's ja noch, man bekommt nur keinen
offiziellen Zugang mehr dazu. Das heißt aber nicht, daß man die Tabelle
nicht doch ausfindig machen kann...

MfG, JBG

-- 
   Jan-Benedict Glaw       jbglaw at lug-owl.de    . +49-172-7608481
   "Eine Freie Meinung in  einem Freien Kopf    | Gegen Zensur | Gegen Krieg
    fuer einen Freien Staat voll Freier Bürger" | im Internet! |   im Irak!
      ret = do_actions((curr | FREE_SPEECH) & ~(IRAQ_WAR_2 | DRM | TCPA));
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : nicht verfügbar
Dateityp    : application/pgp-signature
Dateigröße  : 189 bytes
Beschreibung: nicht verfügbar
URL         : <https://mlists.in-berlin.de/pipermail/linux-l-mlists.in-berlin.de/attachments/20030801/e88943a8/attachment.sig>


Mehr Informationen über die Mailingliste linux-l