libtree: Δείτε τις δυναμικές βιβλιοθήκες που χρησιμοποιεί ένα πρόγραμμα

Στο σύντομο αυτό σημείωμα θα δούμε ένα καλύτερο τρόπο να δεις τις δυναμικές βιβλιοθήκες που χρησιμοποιεί ένα πρόγραμμα (άμεσες και έμμεσες) και να δεις σε περίπτωση που δεν τρέχει τι του λείπει και σε δύσκολες περιπτώσεις αν έχεις πολλές εκδόσεις της ίδια βιβλιοθήκης αν χρησιμοποιεί την σωστή.

Εγκατάσταση


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

2 «Μου αρέσει»

Δε θα μπορούσε ένας αρχάριος στον προγραμματισμό να δει ποιες βιβλιοθήκες χρησιμοποιεί ένα πρόγραμμα για να κάνει αυτό που κάνει, και να χρησιμοποιήσει κάποια-ες από αυτές για να τις προσαρμόσει σε κάποιο δικό του πρόγραμμα; (πιο απλό λογικά) . Στέκει αυτό;

Δεν ξέρω αν κατάλαβα την ερώτηση. Αν θέλεις να γράψεις ένα πρόγραμμα μπορεί απλά να κοιτάξεις αντίστοιχο open source κώδικα ή να κοιτάξεις τι εργαλεία είναι διαθέσιμα για αυτό που θέλεις να κάνεις. Δεν μπορώ να δω την σύνδεση με τα παραπάνω.

1 «Μου αρέσει»