Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

genso - Shared Object erzeugen

&pagelevel(3)&pagelevel

Mit Hilfe des Kommandos genso werden Shared Objects erzeugt.

Syntax


/usr/bin/genso  [optionen] [dateien] 


Optionen
genso unterstützt einige der für den POSIX-C-Compiler verwendeten Optionen; andere Optionen wurden von dem auf UNIX-Systemen verwendeten Kommando ld abgeleitet.

-L dir

Das Verzeichnis dir wird in die Liste mit Verzeichnissen aufgenommen, in denen genso nach Bibliotheken sucht. Die Option -L muss immer vor der Option -l angegeben werden und gilt bis zur nächsten Angabe von -L.

-L bs2000_user_id

Nur in Verbindung mit B plam : Name der BS2000-Benutzerkennung.

Folgende Angabe sind möglich: 

$

steht für TSOS

.

(Punkt) steht für die Benutzerkennung, unter der die Anwendung abläuft

%name

wenn explizit eine BS2000-Benutzerkennung angegeben werden soll. Die Benutzerkennung muss dann in die Umgebungsvariable name geschrieben werden.

-l xxx

libxxx.a oder libxxx.so wird zum Erzeugen eines Shared Object verwendet. Welche Art von Bibliothek verwendet wird, hängt davon ab, ob -B static oder -B dynamic verwendet wird. Wenn keine Angabe gemacht wird, haben dynamische Bibliotheken Vorrang.

-l plam_bibliothek

Nur in Verbindung mit B plam : Name der BS2000-PLAM-Bibliothek.

-m member

Nur in Verbindung mit B plam : Name des zu verarbeitenden Elements der BS2000-PLAM-Bibliothek.

-o ausgabe

Name des Shared Object, das erzeugt werden soll. Das Shared Object wird unter diesem Namen im aktuellen Verzeichnis abgelegt. Der Dateiname sollte auf .so enden; er wird nicht automatisch auf .so ergänzt. Um Missverständnisse zu vermeiden, werden die Endungen .o und .a abgewiesen.

-B plam

Von nun an werden PLAM-Bibliotheken verarbeitet. Zum Umschalten auf ar- oder so-Bibliotheken muss B ar angegeben werden.

-B ar

Wenn PLAM-Bibliotheken verarbeitet wurden, so wird nun auf ar-Bibliotheken bzw. so-Bibliotheken umgeschaltet.

-S low | -S high

Der Inhalt des Shared Object wird auf stdout ausgegeben.

Ist der Dateiname kein absoluter oder relativer Pfad, dann wird die Datei in den mit der Umgebungsvariablen LD_LIBRARY_PATH spezifizierten Verzeichnissen oder in /usr/lib gesucht. Bei der Anwendung auf eine Datei im aktuellen Verzeichnis ist also gegebenenfalls ein ./ voranzustellen, falls dieses Verzeichnis nicht in der Umgebungsvariablen LD_LIBRARY_PATH spezifiziert ist.

-S low gibt nur den Inhalt des aktuellen Shared Object aus.

-S high gibt zusätzlich zum Inhalt des aktuellen Shared Object noch den Inhalt aller abhängigen Objekte aus.

-X lang=c | lang=c++ | lang=cobol

Gibt die Programmiersprache des nachzuladenden Objekts an. Mischungen sind möglich.

Standardwert ist lang=c .

-B static

Wenn diese Option in der Kommandozeile angegeben wird, erhalten statische Bibliotheken (.a) Priorität gegenüber dynamischen (.so).

-B dynamic

Wenn diese Option in der Kommandozeile angegeben wird, erhalten dynamische Bibliotheken (.so) Priorität gegenüber statischen (.a).

-B symbolic

Die Adressauflösung findet beim Laden eines Objekts über dlopen() statt, und zwar in folgender Reihenfolge:

(1) Geladenes Programm a.out

(2) Alle Shared Objects, die vor dem zu ladenden Objekt geladen werden (RTLD_GLOBAL)

(3) Zu ladendes Objekt

-B symbolic nicht angegeben:

Die Adressauflösung findet in umgekehrter Reihenfolge statt (3 - 2 - 1).

Dateien

Es können nur Dateinamen mit dem Namenssuffix .o (bzw. mit dem Namenssuffix .so bei Verwendung der -S option) angegeben werden. Ausführbare Dateien müssen ggf. umbenannt werden.

Dateien können nur nach allen Optionen angegeben werden.

Endestatus  

Folgende Exit-Werte werden zurückgegeben:

0

Generierung erfolgreich

>0

Fehler

Datei

In dem Verzeichnis, in dem die Ausgabe generiert wird, wird ein temporäres Verzeichnis eingerichtet. Dieses Verzeichnis wird bei Beendigung des Kommandos wieder gelöscht.

Umgebung

Für die Suche nach Bibliotheksverzeichnissen gelten folgende Prioritäten:

  1. Verzeichnisse, die in der Variablen LD_LIBRARY_PATH enthalten sind. Werden dort mehrere Verzeichnisse angegeben, dann müssen diese durch einen Doppelpunkt getrennt sein (ohne Leerzeichen!).
  2. Verzeichnisse, die über die Option -L definiert sind

Beispiel 1

Es sollen vier Shared Libraries generiert werden: libtest21.so, libtest22.so, libtest23.so und libtest24.so.

Im aktuellen Verzeichnis befinden sich die o-Dateien test21.o, test22.o, test23.o und test24.o.

Die Shared Objects libtest23.so und libtest24.so bestehen jeweils nur aus den o-Dateien test23.o und test24.o.

Die Bibliothek libtest22.so besteht aus test22.o und dem abhängigen Shared Object libtest24.so; die Bibliothek libtest21.so besteht aus test21.o und den abhängigen Shared Objects libtest22.so und libtest23.so.

Für die Generierung der Shared Objects sind folgende Aufrufe von genso notwendig:

genso -o libtest24.so test24.o
genso -o libtest23.so test23.o
genso -o libtest22.so -l test24 test22.o
genso -o libtest21.so -l test22 -l test23 test21.o

Mit der Option S kann man sich den Inhalt eines Shared Object ansehen.

$ genso -S low   ./libtest21.so
analysis of shared object ./libtest21.so
shared object ./libtest21.so consists of
         Grossmodul ofile_GM_.o built of
                 objectmodule /home/bach/dll/test/reihentest/test21.o 
         dep. shared object libtest22.so (/home/bach/dll/test/reihentest/libtest22.so)
         dep. shared object libtest23.so (/home/bach/dll/test/reihentest/libtest23.so)
         option: -X lang=c

Will man auch den Inhalt der abhängigen Bibliotheken sehen, so muss S high angegeben werden.

$ genso -S high ./libtest21.so 
analysis of shared object ./libtest21.so
shared object ./libtest21.so consists of
         Grossmodul ofile_GM_.o built of
                 objectmodule /home/bach/dll/test/reihentest/test21.o 
         dep. shared object libtest22.so (/home/bach/dll/test/reihentest/libtest22.so)
         dep. shared object libtest23.so (/home/bach/dll/test/reihentest/libtest23.so)
         option: -X lang=c
analysis of shared object /home/bach/dll/test/reihentest/libtest22.so
shared object /home/bach/dll/test/reihentest/libtest22.so consists of
         Grossmodul ofile_GM_.o built of
                 objectmodule /home/bach/dll/test/reihentest/test22.o 
         dep. shared object libtest24.so (/home/bach/dll/test/reihentest/libtest24.so)
         option: -X lang=c
analysis of shared object /home/bach/dll/test/reihentest/libtest24.so
shared object /home/bach/dll/test/reihentest/libtest24.so consists of
         Grossmodul ofile_GM_.o built of
                 objectmodule /home/bach/dll/test/reihentest/test24.o 
         option: -X lang=c
analysis of shared object /home/bach/dll/test/reihentest/libtest23.so
shared object /home/bach/dll/test/reihentest/libtest23.so consists of
         Grossmodul ofile_GM_.o built of
                 objectmodule /home/bach/dll/test/reihentest/test23.o 
         option: -X lang=c

Beispiel 2

Es soll ein Shared Objekt libp1.so aus den folgenden Bestandteilen erzeugt werden:

  • aus dem Element UNTEST1.O aus der PLAM-Bibliothek $BACH.DL.LIB

  • aus allen Elementen der ar-Bibliothek libar.a und der o-Datei file1.o.

Das Kommando zur Generierung wird unter der Kennung $BACH aufgerufen und sieht folgendermaßen aus:

genso -o libp1.so -B plam -L . -lDL.LIB -m UNTEST1.O -B ar -L . -l ar file1.o

Dabei bedeutet -B plam -L . -lDL.LIB, dass DL.LIB eine PLAM-Bibliothek ist, die sich in Benutzerkennung befindet, unter der genso aufgerufen wird.

Sieht man sich den Inhalt von libp1.so an, so erhält man:

$ genso -S low ./libp1.so
analysis of shared object ./libp1.so
shared object ./libp1.so consists of
         Grossmodul ofile_GM_.o built of
                 objectmodule /home/bach/dll/newcommands/file1.o 
         arlibrary /home/bach/dll/newcommands/libar.a with elements 
                 objectmodule arfile1.o 
                 objectmodule arfile2.o
         plam library dl.lib with elements
                UNTEST1.O
          option: -X lang=c