Sostituire una libreria con una compilata

Discussioni relative a Debian e Linux
Rispondi
sirio81
Hero Member
Hero Member
Messaggi: 1104
Iscritto il: 13/02/2006, 5:04
Contatta:

Sostituire una libreria con una compilata

Messaggio da sirio81 »

Ciao a tutti, in riferimento ad un caso pratico mi trovo a voler compilare l'ultima versione disponibile di libqtkeychain per vedere se un bug con kwallet è stato risolto.

Il bug di questa libreria impatta sull'applicazione owncloud client.
Se provo a rimuovere la libreria, aptitude giustamente vuole rimuovere anche owncloud.

Codice: Seleziona tutto

aptitude remove libqtkeychain0
I seguenti pacchetti saranno RIMOSSI:               
  libqtkeychain0 
0 pacchetti aggiornati, 0 installati, 1 da rimuovere e 0 non aggiornati.
È necessario prelevare 0 B di archivi. Dopo l'estrazione, verranno liberati 179 kB.
I seguenti pacchetti hanno dipendenze non soddisfatte:
 libowncloudsync0 : Dipende: libqtkeychain0 (>= 0.3) but it is not going to be installed.
 owncloud-client : Dipende: libqtkeychain0 but it is not going to be installed.
Le seguenti azioni permetteranno di soddisfare queste dipendenze:

     Rimuovere i seguenti pacchetti:
1)     libowncloudsync0             
2)     owncloud-client              
3)     owncloud-client-l10n  
Come mi devo comportare in questo caso?
Avatar utente
HAL 9000
wiki member
wiki member
Messaggi: 1595
Iscritto il: 10/08/2009, 10:01

Re: Sostituire una libreria con una compilata

Messaggio da HAL 9000 »

Prima di rimuovere la libreria, potresti provare a compilare quella patchata, e poi puoi costringere il programma che usi a utilizzare quella con la variabile d'ambiente LD_PRELOAD.

Per esempio:

Codice: Seleziona tutto

$ LD_PRELOAD=/percorso-nuova-libreria/nome-libreria /percorso-eseguibile/eseguibile argomenti...
Oppure, se ci sono più librerie, indicando il solo percorso:

Codice: Seleziona tutto

$ LD_LIBRARY_PATH=/percorso-nuove-librerie /percorso-eseguibile/eseguibile argomenti...
Così ti assicuri che la libreria funzioni senza modificare il sistema. Poi si può vedere come rendere effettive le modifiche, oppure a creare un pacchetto deb con la nuova libreria o anche a crearne uno fittizio per soddisfare la dipendenza mancante.
Ricordarsi di modificare il primo messaggio della discussione per aggiungere [RISOLTO] prima del titolo, quando conclusa.

Wiki: APT e Repository, Comandi utili, Collabora.
Manuali di Debian 12 "bookworm" (PC): installazione, aggiornamento.
sirio81
Hero Member
Hero Member
Messaggi: 1104
Iscritto il: 13/02/2006, 5:04
Contatta:

Re: Sostituire una libreria con una compilata

Messaggio da sirio81 »

Hal9000, grazie delle info.
Per testare va più che bene modificare una variabile d'ambiente.
Se il mio esperimento avrà esito positivo, dovrebbero poi pensarci quelli di owncloud a pacchettizzare la nuova versione della libreria.
sirio81
Hero Member
Hero Member
Messaggi: 1104
Iscritto il: 13/02/2006, 5:04
Contatta:

Re: Sostituire una libreria con una compilata

Messaggio da sirio81 »

Sono riuscito a compilare la libreria.
@HAL9000, mi puoi dire se ho usato la variabile in modo corretto?

Codice: Seleziona tutto

nano owncloud.sh
export LD_PRELOAD='/usr/src/qtkeychain/libqtkeychain.so.0.6.90 /usr/bin/owncloud'
owncloud

./owncloud.sh

ERROR: ld.so: object '/usr/bin/owncloud' from LD_PRELOAD cannot be preloaded (cannot dynamically load executable): ignored.
owncloud: symbol lookup error: /usr/lib/x86_64-linux-gnu/libowncloudsync.so.0: undefined symbol: _ZN9QKeychain15ReadPasswordJob6setKeyERK7QString
Avatar utente
HAL 9000
wiki member
wiki member
Messaggi: 1595
Iscritto il: 10/08/2009, 10:01

Re: Sostituire una libreria con una compilata

Messaggio da HAL 9000 »

Se usi export devi fare così, senza owncloud in "LD_PRELOAD":

Codice: Seleziona tutto

#! /bin/sh
export LD_PRELOAD='/usr/src/qtkeychain/libqtkeychain.so.0.6.90'
owncloud
Con il primo comando modifichi le variabili d'ambiente ereditate dagli eseguibili avviati e con il secondo lanci owncloud.


Oppure alternativamente:

Codice: Seleziona tutto

#! /bin/sh
LD_PRELOAD='/usr/src/qtkeychain/libqtkeychain.so.0.6.90' owncloud
Lanci ownclient con la variabile d'ambiente LD_PRELOAD così definita. L'unica differenza è che se eseguissi un altro eseguibile dallo stesso script (che non è il caso) questo non erediterebbe LD_PRELOAD, per questo io per abitudine preferisco sempre metterlo prima dell'eseguibile, visto che potrebbe sennò alterare il comportamento di altri, ma in questo caso non c'è differenza.


Comunque così facendo risolvi soltanto il primo messaggio di errore, quello relativo a /usr/bin/owncloud, ma non credo si risolva il secondo, che penso dipenda dall'incompatibilità tra la versione installata di ownclient (e la libreria libowncloudsync) con la nuova versione della libreria di qtkeychain, che è quello che volevo testare prima di rimuovere il pacchetto della libreria dal sistema.

Se non si risolve, l'unica è disinstallare anche ownclient e installare l'ultima versione. Alternativamente potresti provare ad applicare l'ultima patch alla libreria qtkeychain della versione installata in Debian, ma non ci sono garanzie sul suo funzionamento, visto che sarebbero applicate a versioni diverse (0.6 invece di 0.5).
Ricordarsi di modificare il primo messaggio della discussione per aggiungere [RISOLTO] prima del titolo, quando conclusa.

Wiki: APT e Repository, Comandi utili, Collabora.
Manuali di Debian 12 "bookworm" (PC): installazione, aggiornamento.
sirio81
Hero Member
Hero Member
Messaggi: 1104
Iscritto il: 13/02/2006, 5:04
Contatta:

Re: Sostituire una libreria con una compilata

Messaggio da sirio81 »

dipenda dall'incompatibilità tra la versione installata di ownclient (e la libreria libowncloudsync)
Immagino che owncloud-client vada ricompilato usando i (miei) sorgenti della libreria qtkeychain.
Ho provato ad intraprendere questo percorso, non è particolarmente complicato.
Sul sito di owncloud c'è la documentazione.
Cmake richiede due variabili che devono puntare alla libreria qtkeychain:

Codice: Seleziona tutto

QTKEYCHAIN_LIBRARY=/path/to/qtkeychain.dylib -DQTKEYCHAIN_INCLUDE_DIR=/path/to/qtkeychain/

ma non ho chiaro a quali sottodirectory nello specifico le devo associare.


Questo è il contenuto dei sorgenti di qtkeychain:

Codice: Seleziona tutto

ls -l qtkeychain/
totale 580
-rw-r--r-- 1 root root    891 apr  1 16:12 ChangeLog
drwxr-xr-x 3 root root   4096 apr  1 16:12 cmake
-rw-r--r-- 1 root root  56958 apr  1 16:15 CMakeCache.txt
drwxr-xr-x 9 root root   4096 apr  1 16:31 CMakeFiles
-rw-r--r-- 1 root root   5415 apr  1 16:15 cmake_install.cmake
-rw-r--r-- 1 root root   6738 apr  1 16:12 CMakeLists.txt
-rw-r--r-- 1 root root   1192 apr  1 16:12 COPYING
-rw-r--r-- 1 root root   3346 apr  1 16:12 gnomekeyring.cpp
-rw-r--r-- 1 root root   3479 apr  1 16:12 gnomekeyring_p.h
-rw-r--r-- 1 root root   5594 apr  1 16:12 keychain.cpp
-rw-r--r-- 1 root root   3562 apr  1 16:12 keychain.h
-rw-r--r-- 1 root root   5942 apr  1 16:12 keychain_mac.cpp
-rw-r--r-- 1 root root   4404 apr  1 16:12 keychain_p.h
-rw-r--r-- 1 root root  19229 apr  1 16:12 keychain_unix.cpp
-rw-r--r-- 1 root root   6363 apr  1 16:12 keychain_win.cpp
-rw-r--r-- 1 root root    800 apr  1 16:31 kwallet_interface.cpp
-rw-r--r-- 1 root root  15710 apr  1 16:31 kwallet_interface.h
-rw-r--r-- 1 root root  22086 apr  1 16:31 kwallet_interface.moc
-rw-r--r-- 1 root root    720 apr  1 16:25 kwallet_interface.moc_parameters
lrwxrwxrwx 1 root root     18 apr  1 16:31 libqtkeychain.so -> libqtkeychain.so.0
lrwxrwxrwx 1 root root     23 apr  1 16:31 libqtkeychain.so.0 -> libqtkeychain.so.0.6.90
-rwxr-xr-x 1 root root 230552 apr  1 16:31 libqtkeychain.so.0.6.90
-rw-r--r-- 1 root root  12726 apr  1 16:25 Makefile
-rw-r--r-- 1 root root   8567 apr  1 16:31 moc_keychain.cxx
-rw-r--r-- 1 root root    706 apr  1 16:25 moc_keychain.cxx_parameters
-rw-r--r-- 1 root root  12458 apr  1 16:31 moc_keychain_p.cxx
-rw-r--r-- 1 root root    710 apr  1 16:25 moc_keychain_p.cxx_parameters
-rw-r--r-- 1 root root  10762 apr  1 16:12 org.kde.KWallet.xml
-rw-r--r-- 1 root root    324 apr  1 16:12 qkeychain_export.h
-rw-r--r-- 1 root root     78 apr  1 16:15 QtKeychainBuildTreeSettings.cmake
-rw-r--r-- 1 root root     80 apr  1 16:12 QtKeychainBuildTreeSettings.cmake.in
-rw-r--r-- 1 root root    779 apr  1 16:15 QtKeychainConfig.cmake
-rw-r--r-- 1 root root    858 apr  1 16:12 QtKeychainConfig.cmake.in
-rw-r--r-- 1 root root    368 apr  1 16:15 QtKeychainConfigVersion.cmake
-rw-r--r-- 1 root root    382 apr  1 16:12 QtKeychainConfigVersion.cmake.in
-rw-r--r-- 1 root root   4350 apr  1 16:31 qtkeychain_de.qm
-rw-r--r-- 1 root root   4815 apr  1 16:31 qtkeychain_ro.qm
lrwxrwxrwx 1 root root     10 apr  1 16:12 ReadMe.markdown -> ReadMe.txt
-rw-r--r-- 1 root root   1105 apr  1 16:12 ReadMe.txt
-rwxr-xr-x 1 root root  27264 apr  1 16:31 testclient
-rw-r--r-- 1 root root   4603 apr  1 16:12 testclient.cpp
drwxr-xr-x 2 root root   4096 apr  1 16:12 translations
PS: secondo me si sono dimenticati un trattino (-) davanti a QTKEYCHAIN_LIBRARY.
sirio81
Hero Member
Hero Member
Messaggi: 1104
Iscritto il: 13/02/2006, 5:04
Contatta:

Re: Sostituire una libreria con una compilata

Messaggio da sirio81 »

Questo è stato il mio tentativo:

Codice: Seleziona tutto

root@debian:/usr/src/owncloud-client# cmake -DCMAKE_BUILD_TYPE="Debug" -QTKEYCHAIN_LIBRARY=/usr/src/qtkeychain/libqtkeychain.so.0.6.90 -DQTKEYCHAIN_INCLUDE_DIR=/usr/src/owncloud-client .
-- Build of crashreporter disabled.
-- Could not find Qt5, searching for Qt4 instead...
-- Looking for Q_WS_X11
-- Looking for Q_WS_X11 - found
-- Looking for Q_WS_WIN
-- Looking for Q_WS_WIN - not found
-- Looking for Q_WS_QWS
-- Looking for Q_WS_QWS - not found
-- Looking for Q_WS_MAC
-- Looking for Q_WS_MAC - not found
-- Found Qt4: /usr/bin/qmake (found suitable version "4.8.6", minimum required is "4.7.0") 
-- GIT_SHA1 84ad0d234e294c1b9ad1dad728d3441cee4c3953
-- If possible compile me with Qt 5.4 or higher.
CMake Error at /usr/share/cmake-3.0/Modules/FindPackageHandleStandardArgs.cmake:136 (message):
  Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
  system variable OPENSSL_ROOT_DIR (missing: OPENSSL_LIBRARIES
  OPENSSL_INCLUDE_DIR) (Required is at least version "1.0.0")
Call Stack (most recent call first):
  /usr/share/cmake-3.0/Modules/FindPackageHandleStandardArgs.cmake:343 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-3.0/Modules/FindOpenSSL.cmake:328 (find_package_handle_standard_args)
  CMakeLists.txt:147 (find_package)


-- Configuring incomplete, errors occurred!
See also "/usr/src/owncloud-client/CMakeFiles/CMakeOutput.log".
See also "/usr/src/owncloud-client/CMakeFiles/CMakeError.log".
E In CMakeError.log trovo

Codice: Seleziona tutto

/root/client/CMakeFiles/CMakeTmp/CheckSymbolExists.cxx: In function ‘int main(int, char**)’:
/root/client/CMakeFiles/CMakeTmp/CheckSymbolExists.cxx:8:19: error: ‘Q_WS_WIN’ was not declared in this scope
   return ((int*)(&Q_WS_WIN))[argc];
                   ^
CMakeFiles/cmTryCompileExec2548255728.dir/build.make:57: set di istruzioni per l'obiettivo "CMakeFiles/cmTryCompileExec2548255728.dir/CheckSymbolExists.cxx.o" non riuscito
make[1]: uscita dalla directory "/root/client/CMakeFiles/CMakeTmp"
make[1]: *** [CMakeFiles/cmTryCompileExec2548255728.dir/CheckSymbolExists.cxx.o] Errore 1
Makefile:118: set di istruzioni per l'obiettivo "cmTryCompileExec2548255728/fast" non riuscito
make: *** [cmTryCompileExec2548255728/fast] Errore 2
sirio81
Hero Member
Hero Member
Messaggi: 1104
Iscritto il: 13/02/2006, 5:04
Contatta:

Re: Sostituire una libreria con una compilata

Messaggio da sirio81 »

Sono riuscito a compilare con successo owncloud client.
Mi mancava una libreria e poi ho aggiustato le variabili di cmake

Codice: Seleziona tutto

sudo apt-get install libssl-dev
cd /usr/src/owncloud-client
cmake -DCMAKE_BUILD_TYPE="Debug" -DQTKEYCHAIN_LIBRARY=/usr/src/qtkeychain/libqtkeychain.so.0.6.90 -DQTKEYCHAIN_INCLUDE_DIR=/usr/src/qtkeychain -DBUILD_WITH_QT4=ON ./
Quando lancio il client però ricevo comunque l'errore

Codice: Seleziona tutto

ERROR: ld.so: object '/usr/bin/owncloud' from LD_PRELOAD cannot be preloaded (cannot dynamically load executable): ignored.
owncloud: symbol lookup error: /usr/lib/x86_64-linux-gnu/libowncloudsync.so.0: undefined symbol: _ZN9QKeychain15ReadPasswordJob6setKeyERK7QString
Mi sa che ci rinuncio e aspetto che aggiornino i pacchetti sui repo... :-[
sirio81
Hero Member
Hero Member
Messaggi: 1104
Iscritto il: 13/02/2006, 5:04
Contatta:

Re: Sostituire una libreria con una compilata

Messaggio da sirio81 »

Riassumo quanto fatto sin'ora:

rimosso tutti i pacchetti relativi ad owncloud onde evitare confusione e ovviamente anche libqtkeychain.
Per compilare qtkeychain e owncloud ho usato la seguente procedura:

qtkeychain

Codice: Seleziona tutto

apt-get install git build-essential libqt4-dev cmake
cd /usr/src
git clone https://github.com/frankosterfeld/qtkeychain.git
cd qtkeychain
mkdir build
cmake -DCMAKE_INSTALL_PREFIX=/usr/local
make install
owncloud client

Codice: Seleziona tutto

apt-get install libssl-dev libinotifytools0-dev libinotifytools0
cd /usr/src
https://github.com/owncloud/client.git
mv client owncloud-client
cd owncloud-client
rm CMakeCache.txt
cmake -DCMAKE_BUILD_TYPE="Debug" -DQTKEYCHAIN_LIBRARY=/usr/local/lib/x86_64-linux-gnu/libqtkeychain.so -DQTKEYCHAIN_INCLUDE_DIR=/usr/local/lib/include/qtkeychain -DBUILD_WITH_QT4=ON .
make install
Per eseguire owncloud lo devo lanciare da percorso assoluto (e parte!)
/usr/src/owncloud-client/bin/owncloud
altrimenti ottengo l'errore

Codice: Seleziona tutto

owncloud: error while loading shared libraries: libowncloudsync.so.0: cannot open shared object file: No such file or directory
Owncloud continua a chiedere la password però, quindi il bug non sembra risolto con l'ultima versione di qtkeychain.

Sono in dubbio sul fatto che cmake riporta un errore a proposito di kf5 che su jessie non esiste
(notare che ho passato anche l'opzione BUILD_WITH_QT4=ON)

Codice: Seleziona tutto

cmake -CMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE="Debug"
-DQTKEYCHAIN_LIBRARY=/usr/local/lib/x86_64-linux-gnu/libqtkeychain.so
-DQTKEYCHAIN_INCLUDE_DIR=/usr/local/lib/include/qtkeychain
-DBUILD_WITH_QT4=ON ./

CMake Warning at shell_integration/CMakeLists.txt:11 (find_package):
  By not providing "FindKF5.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "KF5", but
  CMake did not find one.

  Could not find a package configuration file provided by "KF5" (requested
  version 5.16) with any of the following names:

    KF5Config.cmake
    kf5-config.cmake

  Add the installation prefix of "KF5" to CMAKE_PREFIX_PATH or set "KF5_DIR"
  to a directory containing one of the above files.  If "KF5" provides a
  separate development package or SDK, be sure it has been installed.


Dolphin plugin disabled: KDE Frameworks 5.16 not found
-- Could NOT find Doxygen (missing:  DOXYGEN_EXECUTABLE)
-- Configuring incomplete, errors occurred!
See also "/usr/src/owncloud-client/CMakeFiles/CMakeOutput.log".
See also "/usr/src/owncloud-client/CMakeFiles/CMakeError.log".
Rispondi