Στο σύντομο αυτό σημείωμα θα δούμε ένα καλύτερο τρόπο να δεις τις δυναμικές βιβλιοθήκες που χρησιμοποιεί ένα πρόγραμμα (άμεσες και έμμεσες) και να δεις σε περίπτωση που δεν τρέχει τι του λείπει και σε δύσκολες περιπτώσεις αν έχεις πολλές εκδόσεις της ίδια βιβλιοθήκης αν χρησιμοποιεί την σωστή.
Εγκατάσταση
asfodelus@pop-os:~$ wget -qO libtree https://github.com/haampie/libtree/releases/download/v2.0.0/libtree_x86_64 asfodelus@pop-os:~$ chmod +x libtree asfodelus@pop-os:~$ mv libtree .local/bin/
Χρήση
Ας συγκρίνουμε τις διαφορές ανάμεσα στα δυο προγράμματα. Σαν παράδειγμα χρησιμοποιώ το vlc
ένα πρόγραμμα που δεν έχει πολλές εξαρτήσεις. Η παράμετρος -p
δείχνει την διαδρομή αντί για το λεγόμενο soname
.
asfodelus@pop-os:~$ libtree -p /usr/bin/vlc /usr/bin/vlc └── /usr/lib/x86_64-linux-gnu/libvlc.so.5.6.0 [ld.so.conf] └── /usr/lib/x86_64-linux-gnu/libvlccore.so.9.0.0 [ld.so.conf] ├── /usr/lib/x86_64-linux-gnu/libidn.so.11.6.16 [ld.so.conf] └── /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.19.13 [ld.so.conf] └── /usr/lib/x86_64-linux-gnu/libsystemd.so.0.31.0 [ld.so.conf] ├── /usr/lib/x86_64-linux-gnu/liblzma.so.5.2.5 [ld.so.conf] ├── /usr/lib/x86_64-linux-gnu/libzstd.so.1.4.8 [ld.so.conf] ├── /usr/lib/x86_64-linux-gnu/liblz4.so.1.9.3 [ld.so.conf] ├── /usr/lib/x86_64-linux-gnu/libcap.so.2.44 [ld.so.conf] └── /usr/lib/x86_64-linux-gnu/libgcrypt.so.20.2.8 [ld.so.conf] asfodelus@pop-os:~$ ldd /usr/bin/vlc linux-vdso.so.1 (0x00007ffc67df4000) libvlc.so.5 => /lib/x86_64-linux-gnu/libvlc.so.5 (0x00007fbe201a8000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fbe201a0000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbe20198000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbe1ff70000) libvlccore.so.9 => /lib/x86_64-linux-gnu/libvlccore.so.9 (0x00007fbe1fe60000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbe1fd78000) /lib64/ld-linux-x86-64.so.2 (0x00007fbe20200000) libidn.so.11 => /lib/x86_64-linux-gnu/libidn.so.11 (0x00007fbe1fd40000) libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007fbe1fcf0000) libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007fbe1fc38000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007fbe1fc08000) libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007fbe1fb38000) liblz4.so.1 => /lib/x86_64-linux-gnu/liblz4.so.1 (0x00007fbe1fb18000) libcap.so.2 => /lib/x86_64-linux-gnu/libcap.so.2 (0x00007fbe1fb08000) libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007fbe1f9e0000) libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007fbe1f9b8000)
Ίσως προσέξατε κάποιες διαφορές στις βιβλιοθήκες για να τις δείτε όλες προσθέσετε την παράμετρο -a
asfodelus@pop-os:~$ libtree -pa /usr/bin/vlc
Προχωρημένη χρήση
Αλλά το libtree
δεν αρκείται μόνο σε αυτό. Μπορεί να μαζέψει τις εξαρτήσεις μαζί με το πρόγραμμα και να τις βάλεις σε ένα φάκελο. Θα πρέπει να υπάρχει εγκατεστημένη η εντολή chrpath
.
asfodelus@pop-os:~$ libtree $(which man) -d man.bundle –chrpath –strip
Δυστυχώς υπάρχουν οι περιορισμοί της chrpath
και για το vlc
δεν δούλεψε. Στο μέλλον ίσως το κάνει με την πιο επικίνδυνη εντολή patchelf
. Δεν θα λεχθεί κάτι παραπάνω για αυτό, ίσως κάποια στιγμή γραφτεί ένα άρθρο “κάτω από το καπάκι” για τις δυναμικές βιβλιοθήκες του Linux. Καλό είναι να ξέρουμε ότι μπορείς τουλάχιστον σε κάποιες περιπτώσεις να το κάνεις εύκολα. Η χρησιμότητα του είναι πως ίσως καταφέρεις να πάρεις ένα πρόγραμμα από μια παλιά διανομή και να το καταφέρεις να τρέξει.
Επίσης κάτι που ίσως φανεί χρήσιμο στο να δεις πως ψάχνει τις βιβλιοθήκες ένα πρόγραμμα είναι να καλέσεις απευθείας τον ίδιο τον linker ld.so(8)
asfodelus@pop-os:~$ LD_DEBUG=libs /lib64/ld-linux-x86-64.so.2 –list /usr/bin/ls
Διαβάστε
Για περισσότερα δείτε στην σελίδα του στο github