dlopen Problem

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Friam
Beiträge: 140
Registriert: 29.06.2006 20:57:56
Wohnort: Kaiserslautern
Kontaktdaten:

dlopen Problem

Beitrag von Friam » 14.06.2018 13:16:19

Hallo Forum,

ich habe ein Programm "UnitTest" und eine Bibliothek "libTest.so" in einem Ordner.
Ich versuche die Bibilothek zu laden über:

Code: Alles auswählen

		std::string stdStr("libTest.so");
		const char* cStr = stdStr.c_str();
 		m_pModule = dlopen(cStr, RTLD_LAZY);
 		
Dabei ist das Verzeichnis, in dem die beiden liegen in der Runpath des Programms eingetragen:
readelf -d CfUnitTest |head -20

Dynamic section at offset 0x342d20 contains 33 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000001d (RUNPATH) Library runpath: [/mnt/e/code/RT/buildGcc/bin]
Aber ein
LD_DEBUG=all ./bin/UnitTest
führt zu:
1498: file=libTest.so [0]; dynamically loaded by /mnt/e/code/RT/buildGcc/bin/libCf.so [0]
1498: find library=libTest.so [0]; searching
1498: search cache=/etc/ld.so.cache
1498: search path=/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls:/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu:/lib/tls/x86_64:/lib/tls:/lib/x86_64:/lib:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/x86_64:/usr/lib (system search path)
1498: trying file=/lib/x86_64-linux-gnu/tls/x86_64/libTest.so
1498: trying file=/lib/x86_64-linux-gnu/tls/libTest.so
1498: trying file=/lib/x86_64-linux-gnu/x86_64/libTest.so
1498: trying file=/lib/x86_64-linux-gnu/libTest.so
1498: trying file=/usr/lib/x86_64-linux-gnu/tls/x86_64/libTest.so
1498: trying file=/usr/lib/x86_64-linux-gnu/tls/libTest.so
1498: trying file=/usr/lib/x86_64-linux-gnu/x86_64/libTest.so
1498: trying file=/usr/lib/x86_64-linux-gnu/libTest.so
1498: trying file=/lib/tls/x86_64/libTest.so
1498: trying file=/lib/tls/libTest.so
1498: trying file=/lib/x86_64/libTest.so
1498: trying file=/lib/libTest.so
1498: trying file=/usr/lib/tls/x86_64/libTest.so
1498: trying file=/usr/lib/tls/libTest.so
1498: trying file=/usr/lib/x86_64/libTest.so
1498: trying file=/usr/lib/libTest.so

1498: symbol=dlerror; lookup in file=./bin/UnitTest[0]
Hat jemand eine Ahnung, warum nicht nicht im Runpath gesucht und damit die Bibilothek nicht gefunden wird?
aptitude's initial slogan: "just because it's a terminal program doesn't mean it has to be painful"

MSfree
Beiträge: 3470
Registriert: 25.09.2007 19:59:30

Re: dlopen Problem

Beitrag von MSfree » 14.06.2018 14:06:24

Friam hat geschrieben: ↑ zum Beitrag ↑
14.06.2018 13:16:19
Hat jemand eine Ahnung, warum nicht nicht im Runpath gesucht und damit die Bibilothek nicht gefunden wird?
Unter Linux (und auch unter Unix) werden shared Objects (das, was unter Windws .dll sind) grundsätzlich nicht im PATH gesucht.

Der Pfad, auf dem nach .so gesucht wird, kann in der Umgebungsvariable LD_LIBRARY_PATH gesetzt werden.

Ansonsten kann man auch unter /etc/ld.so.conf und im Unterverzeichnis /etc/ld.so.conf.d Angaben machen, wo nach .so gesucht werden soll.

Friam
Beiträge: 140
Registriert: 29.06.2006 20:57:56
Wohnort: Kaiserslautern
Kontaktdaten:

Re: dlopen Problem

Beitrag von Friam » 14.06.2018 16:28:45

Danke für die Antwort.
Laut der Dokumentation von http://man7.org/linux/man-pages/man3/dlopen.3.html sollte der Inhalt von DT_RUNPATH beachtet werden.
Aber anscheinend ist die Dokumentation falsch und sie wird nicht beachtet. :|
aptitude's initial slogan: "just because it's a terminal program doesn't mean it has to be painful"

Antworten