Fehler: 0509-022 Cannot load module

Kürzlich haben wir auf einigen unserer Systeme yum aus der AIX Toolbox (www.ibm.com/support/pages/aix-toolbox-linux-applications-overview) installiert. Bisher hatten wir RPM-Pakete von Perzl (www.perzl.org) installiert. Bei dem Umstieg auf yum wurden einige RPMs mit Versionen aus der AIX Toolbox aktualisiert. Bei einigen der RPMs gab es in Folge Probleme mit dynamischen Bibliotheken.

Wir behandeln im folgenden eines der Probleme, das bei dem Programm curl aufgetreten ist:

$ curl
exec(): 0509-036 Cannot load program curl because of the following errors:
        0509-022 Cannot load module /opt/freeware/lib/libcurl.a(libcurl.so.4).
        0509-150   Dependent module /opt/freeware/lib/libcrypto.a(libcrypto.so) could not be loaded.
        0509-152   Member libcrypto.so is not found in archive 
        0509-022 Cannot load module curl.
        0509-150   Dependent module /opt/freeware/lib/libcurl.a(libcurl.so.4) could not be loaded.
        0509-022 Cannot load module .
$

Vor der Installation der RPM-Pakete hatte curl noch funktioniert. Das Kommando ldd zum Auflisten dynamischer Abhängigkeiten liefert eine ähnliche Fehlermeldung:

$ ldd /usr/bin/curl
/usr/bin/curl needs:
         /usr/lib/libc.a(shr.o)
         /opt/freeware/lib/libcurl.a(libcurl.so.4)
         /opt/freeware/lib/libz.a(libz.so.1)
         /unix
         /usr/lib/libcrypt.a(shr.o)
         /opt/freeware/lib/libcrypto.a(libcrypto.so)
ar: 0707-109 Member name libcrypto.so does not exist.
dump: /tmp/tmpdir31457524/extract/libcrypto.so: 0654-106 Cannot open the specified file.
         /opt/freeware/lib/libssl.a(libssl.so)
ar: 0707-109 Member name libssl.so does not exist.
dump: /tmp/tmpdir31457524/extract/libssl.so: 0654-106 Cannot open the specified file.
$

Die Datei /opt/freeware/lib/libcrypto.a ist ein Archiv und die Fehlermeldung sagt das in diesem Archiv das Shared Object libcrypto.so nicht existiert. Das lässt sich mit dem Kommando ar leicht überprüfen:

$ ar -X any tv /opt/freeware/lib/libcrypto.a
rwxr-xr-x     0/0     3036810 Apr 08 18:46 2014 libcrypto.so.1.0.1
rwxr-xr-x     0/0     3510308 Apr 08 18:41 2014 libcrypto.so.1.0.1
rw-r--r--     0/0     2012251 Apr 08 18:46 2014 libcrypto.so.0.9.7
rw-r--r--     0/0     2491620 Apr 08 18:46 2014 libcrypto.so.0.9.8
rwxr-xr-x     0/0     2921492 Apr 08 18:46 2014 libcrypto.so.1.0.0
rw-r--r--     0/0     2382757 Apr 08 18:46 2014 libcrypto.so.0.9.7
rw-r--r--     0/0     2923920 Apr 08 18:46 2014 libcrypto.so.0.9.8
rwxr-xr-x     0/0     3381316 Apr 08 18:46 2014 libcrypto.so.1.0.0
$

(Die Option „-X any“ sorgt dafür das sowohl 32– als auch 64-bit Objekte angezeigt werden)

Die Shared Library libcrypto.so befindet sich offensichtlich nicht in dem Archiv! Das Archiv gehört zum OpenSSL-Paket von Perzl:

$ rpm -qf /opt/freeware/lib/libcrypto.a
openssl-1.0.1g-1.ppc
$

Das OpenSSL Paket ist auch die Ursache für die Probleme beim Aufruf von curl und eventuell auch anderen Programmen. Bei den Paketen von Perzl gibt es ein OpenSSL-Paket, welches OpenSSL unterhalb von /opt/freeware zur Verfügung stellt. Die IBM Pakete aus der AIX Toolbox verwenden aber das vom Betriebssystem kommende OpenSSL unter /usr/lib. In der AIX Toolbox gibt es daher kein OpenSSL RPM Paket. Das OpenSSL-Paket von Perzl sollte entfernt werden.

# rpm –e openssl
#

Hat man RPM-Pakete (Perzl), die von OpenSSL abhängig sind, schlägt das Entfernen des OpenSSL RPMs natürlich fehl:

# rpm -e openssl
error: Failed dependencies:
            openssl >= 0.9.8 is needed by (installed) openldap-2.4.23-0.3.ppc
#

In diesem Fall gibt es 2 Möglichkeiten: entweder man deinstalliert das abhängige Paket ebenfalls, oder man aktualisiert das Paket mit einer Version aus der AIX Toolbox. Wir zeigen hier kurz den zweiten Fall:

# yum update openldap
AIX_Toolbox                                                                                   | 2.9 kB  00:00:00    
AIX_Toolbox_71                                                                                | 2.9 kB  00:00:00    
AIX_Toolbox_noarch                                                                            | 2.9 kB  00:00:00    
Setting up Update Process
Resolving Dependencies
--> Running transaction check
---> Package openldap.ppc 0:2.4.23-0.3 will be updated
---> Package openldap.ppc 0:2.4.46-1 will be an update
...

Is this ok [y/N]: y

...

Updated:

  openldap.ppc 0:2.4.46-1                                                                                           

Complete!
#

Anschließend kann das OpenSSL RPM deinstalliert werden:

# rpm -e openssl
#

Nun lässt sich auch curl wieder ohne Problem starten:

$ curl
curl: try 'curl --help' or 'curl --manual' for more information
$

Fazit: Beim Wechseln auf die AIX Toolbox sollte ein eventuell vorhandenes OpenSSL RPM deinstalliert werden!

 

2 Antworten auf „Fehler: 0509-022 Cannot load module“

  1. Ich setze auch seit vielen Jahren die perzl-Pakete ein.
    Beim Deinstallieren von openssl scheitert es an proftpd:

    root@aix:/root# rpm -e openssl
    error: Failed dependencies:
    openssl >= 1.0.2l-1 is needed by (installed) proftpd-1.3.6-1.ppc

    proftpd gibts bei IBM aber nur in Version 1.2.8 ..
    Gibt es empfehlenswerte Alternativen?

    1. Zunächst einmal vielen Dank für die interessante Frage!

      Eine andere Quelle für eine kompilierte Version von proftpd zu finden dürfte nicht ganz so einfach sein. Halte ich aber auch für keine so gute Idee, da man dann Pakete von IBM, von Michael Perzl (vielen Dank für die viele Arbeit die Sie in die Bereitstellung der RPM-Pakete gesteckt haben) und eine weitere Quelle.

      Schaut man sich die Pakete genauer an, zunächst mal das proftpd Paket (rpm -q proftpd –requires), dann sieht man das libcrypto.a und libssl.a mit den aufgelisteten Versionen der Shared-Libraries benötigt werden. Natürlich wird auch die im Spec-File von proftpd definierte Abhängigkeit zum openssl Paket aufgelistet.
      Als nächstes schaut man sich an was das openssl RPM denn genau liefert (rpm -q openssl –provides), das sind natürlich genau die Shared Libraries die von proftpd benötigt werden und mit dem vorigen Kommando auch als required aufgelistet werden. Diese Versionen der Shared Libraries werden aber auch von dem installp-Paket openssl.base in einer aktuellen Version zur Verfügung gestellt. Ob das vom RPM-System auch erkannt wird, lässt sich mittels „rpm -q AIX-rpm –provides“ leicht überprüfen. Wenn hier die benötigten Versionen der Shared Libraries aufgelistet werden, dann heisst das, dass diese für RPM-Paket verfügbar sind und bei richtigem Library-Pfad auch verwendet werden. Der proftpd kommt also definitiv ohne das openssl RPM aus, wenn openssl.base von AIX bereitgestellt wird. Die Abhängigkeit des proftpd-RPMs zum openssl-RPM ist also nicht wirklich notwendig, der proftpd läuft auch ohne das openssl-RPM!
      Es gibt nun mehrere Möglichkeiten das Problem zu lösen (werde ich demnächst mal in einem Beitrag ausführlicher beschreiben, da brauche ich aber etwas mehr Zeit):
      1. Man entfernt einfach das openssl-RPM und ignoriert die Anhängigkeit, dazu
      – Stoppen von proftpd
      – Entfernen von openssl: rpm –nodeps -e openssl
      – Entfernen der nicht mehr vorhandenen Shared Libraries aus dem Kernel: slibclean
      – Starten von proftpd
      Das ist unsauber, funktioniert aber.

      2. Bei Michael Perzl nachfragen ob er nicht die explizite Abhängigkeit zum openssl Paket aus dem Spec-File für proftpd rausnehmen kann, die ist nicht notwendig. Implizit gibt es dann die direkte Anhängigkeit zu den Shared Libraries, die aber dann auch von AIX bereitgestellt werden können. Man könnte dann auf diese neu erzeugte Version updaten und danach openssl entfernen. Die Frage ist dann nur ob Michael Perzl da mitspielt.

      3. Für Linux gibt es ein Paket welches das Kommando rpmrebuild enthält, mit diesem kann man aus installierten Paketen wieder RPM-Files machen und dabei auch das Spec-File editieren. Das habe ich aber selbst noch nicht ausprobiert, würde ich aber einmal testen, wenn ich mal wieder mehr Zeit habe. Hier könnte man dann die Abhängigkeit aus dem Spec-File rausnehmen und dann das gleiche Paket ohne die Abhängigkeit bauen. Das wäre eine saubere Lösung.

      4. Es gibt zum proftpd bei Michael Perzl auch das zugehörige Source RPM. In diesem ist ein Spec-File enthalten. Man könnte damit das Paket dann selber bauen und dabei die unerwünschte Abhängigkeit aus dem Spec-File rausnehmen.

      Ich hoffe das war hilfreich.

      Beste Grüße
      Armin Schmidt

Schreibe einen Kommentar

%d Bloggern gefällt das: