Umgebungsvariablen
-
Moin,
ich hab mal eine Linux (Ubuntu, Kernel Version: 2.6 aus Testzwecken) spezifische Frage. Undzwar habe ich folgendes einfache Programm:
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { printf("%s is at %p\n", argv[1], getenv(argv[1])); }
Soweit so gut; das Programm funktioniert auch und ich habe verstanden, was es macht (ist ja nicht weiter schwierig).
Nehmen wir an, es wurde mit export eine neue Umgebungsvariable TEST erstellt. Lasse ich mir jetzt die Adresse mit
./getenv_example TEST
ausgeben, bekomme ich eine andere Adresse als wenn ich./getenv TEST
nehme (wobei getenv_example und getenv identische Dateien, nur mit anderen Namen ist). Als Beispiel:./a TEST >> TEST: 0xbfffff4e ./ab TEST >> TEST: 0xbfffff4c ./abc TEST >> TEST: 0xbfffff4a ...
(wobei a, ab und abc wieder identische Kopien des Programmes von oben sind). Führt man die Reihe fort, stellt man fest, dass pro Zeichen im Programmname die Adresse der Umgebungsvariable 2 Bytes in Richtung Stackende geschoben werden.
1.) Warum werden die Adressen immer kleiner? Die Umgebungsvariablen liegen doch im Stack vor/über dem "Programmteil". Auch der Programmname, der ja argv[0] bildet, liegt hiner/nach den Umgebungsvariablen (als Shell nutze ich standardmäig bash).
2.) Wenn ich unter Ubuntu ein neues Terminal öffne, öffne ich damit doch erstmal nur ein neues command line interface und keinen neuen command line interpreter oder?
-
Dann ist da eben offensichtlich irgendwo der Programmname wichtig. Das Programm startet schließlich nicht wirklich mit main, sondern einem Startup-Code, der dann main aufruft. Und der muss ja irgendwo die Parameter speichern, die er an main übergibt, zu denen auch der Name des Programms gehört.
edit: Um das mal genauer darzulegen: Du kennst ja anscheinend schon den Stackaufbau einer ELF Executable. Der Programmname liegt unter den Umgebungsvariablen. Wenn der Programmname länger wird, dann müssen die Umgebungsvariablen nach oben wandern. Also zu kleineren Adressen hin.
-
Warum ist es relevant, wo sich die Daten befinden? Es ist doch völlig egal.
-
Der Threadersteller möchte offensichtlich ein paar etwas lowleveligere Details seines Systems verstehen. Das ist doch vollkommen legitim, selbst wenn es keine enorme Praxisrelevanz hat.
-
Makro schrieb:
2.) Wenn ich unter Ubuntu ein neues Terminal öffne, öffne ich damit doch erstmal nur ein neues command line interface und keinen neuen command line interpreter oder?
nein, was ist denn ein "command line interface"? Das Terminal startet jedes mal eine neue Shell, also einen neuen Prozess des Command line interpreters, der in der /etc/passwd zu deinem Benutzer steht.