PDA

View Full Version : Binärer Vergleich zweier *PGM Objekte auf Gleichheit



schatte
10-09-20, 14:14
Hallo zusammen,

ich würde gerne auf einer AS/400 feststellen, ob zwei Programmobjekte (*PGM oder auch *SRVPGM) den gleichen ausführbaren Code enthalten.
Leider hilft mir das Sourceänderungsdatum der enthaltenen *MODULE nicht weiter, da sich dieses Datum ändern kann, jedoch der eigentlich Quellcode gleich bleibt. Das ist der Fall, wenn beispielsweise der Quellcode von einem git respository auf die AS/400 heruntergeladen wird und sich dadurch das Modifikationsdatum ändert.

Man hat also eine Bibliothek mit allen kompilierten Programmobjekten. Irgendwann wird dann der komplette Quellcode von git nochmals erneut auf die AS/400 überspielt und neu in eine andere Bibliothek kompiliert. Nun möchte man feststellen, welche Programme sich tatsächlich geändert haben, um dann die geänderten Programmobjekte auf das eigentliche Zielsystem zu überspielen.
Die zu vergleichenden Objekte wurden alle auf der gleichen LPAR mit gleichem Release erstellt. Sollte sich natürlich einmal das Release ändern, jemand mit CHGPGM die Optimierungsstufe ändert oder die Exportkennung eines eingebunden *SRVPGMs sich ändert, so muss das Objekt als "geändert" ermittelt werden.

Mit DMPOBJ bekommt man leider nur ein Spool. Ein entsprechendes API habe ich leider nicht gefunden.

Hatte jemand schon mal ein ähnliches Problem?

Viele Grüße
Matthias

Fuerchau
10-09-20, 16:48
Nein, das Problem hatte ich bisher nicht.

Aber es gäbe da einen Umweg:
Sichere die zu vergleichenden Objekte je in eine SAVF. Diese kannst du native öffnen und dann vergleichen.
Da alle Informationen (Code/Importe/Exporte/Signaturen) enthalten sind, kannst du eine Differenz ermitteln. Allerdings mit einem Problem:
Auch das Erstelldatum der Module sowie Sourceinformationen ist Bestandteil des Objekts, und du bekommst somit eine Differenz.
Berechtigungen sind da ebenso aufgehoben und du bekommst eine Differenz.

Ich denke, da kommst du um MI-Programmierung kaum herum.
Hier hat sich schon mal einer Mühe gemacht:
https://www.mcpressonline.com/programming/rpg/a-more-complete-view-of-the-machine-interface-of-ibm-i

Allerdings galt dies noch für V5R3. Möglicherweise hat sich ja nicht so viel geändert.

xenofob
10-09-20, 23:58
Naiver Vorschlag:
Wenn's nur um die Gleichheit zweier Objekte geht, könnte man nur die Größe der Objekte vergleichen?

Fuerchau
11-09-20, 07:02
Die Größe von Objekten bemisst sich in 4K-Schritten. Da kann ganz schön viel geändert sein.

ExAzubi
16-09-20, 06:55
Hallo,

es gibt eine Tool Sammlung (for free). diese Berechnet den Hashwert der Objekte und gibt diese aus:

https://software.projex.com/cmpobj-compare-objects/

VG
David

Fuerchau
16-09-20, 09:22
Hast du dies auch mal ausprobiert in dem du ein Programm in 2 Libs jeweils separat neu erstellst?
Jedes Modul/Objekt bekommt dann ein geändertes Erstelldatum, dass u.U. in die Berechnung einfließt.
Ist das nicht der Fall oder kann man das ausschließen, dann erstelle das 2. Programm mit einer minimalen Codeänderung, z.b. statt "Feld += 1" in "Feld += 2" und prüfe dann ob es eine Differenz gibt.

schatte
16-09-20, 19:19
Hallo,

es gibt eine Tool Sammlung (for free). diese Berechnet den Hashwert der Objekte und gibt diese aus:

https://software.projex.com/cmpobj-compare-objects/

VG
David

Darüber war ich beim Suchen auch gestolpert. Hatte mich jedoch nicht überzeugt, da auch das Sourcedatum/Uhrzeit verglichen wird, was sich in meinem Fall trotz gleicher Source ändern kann.
Und sollte das Sourcendatum/zeit gleich sein, so bezieht sich das Sourcedatum auch nur auf die Hauptsource des Moduls und nicht auf evtl. rein kopierte Header (*.h).

Ansonsten schon mal Danke in die Runde für die Hinweise.