ShlibvisibilityChecker adalah alat kecil yang menempatkan simbol internal yang diekspor secara tidak perlu dari perpustakaan bersama. Simbol seperti itu tidak diinginkan karena menyebabkan
--gc-sections ) ShlibvisibilityChecker membandingkan API yang dinyatakan dalam header publik terhadap API yang diekspor dari perpustakaan bersama dan memperingatkan tentang perbedaan. Dalam sebagian besar kasus simbol tersebut adalah simbol perpustakaan internal yang harus disembunyikan (dalam kasus yang jarang ini adalah simbol internal yang digunakan oleh perpustakaan lain atau executable dalam paket yang sama dan shlibvischeck-debian berusaha keras untuk tidak melaporkan kasus tersebut).
Perbedaan seperti itu kemudian harus diperbaiki dengan mengembalikan paket dengan -fvisibility=hidden (lihat di sini untuk detailnya). Perbaikan yang khas, untuk proyek autoconf khas dapat ditemukan di sini.
ShlibvisibilityChecker tidak dimaksudkan untuk 100% tepat tetapi lebih memberikan bantuan dalam menemukan paket yang mungkin paling menguntungkan dari anotasi visibilitas (dan untuk memahami seberapa buruk situasi dengan visibilitas dalam distro modern).
Untuk memeriksa paket mentah, yaitu sekelompok header dan libs bersama, mengumpulkan antarmuka sumber dan biner dan membandingkannya:
$ bin/read_header_api --only-args /usr/include/xcb/* > api.txt
$ ./read_binary_api --permissive /usr/lib/x86_64-linux-gnu/libxcb*.so > abi.txt
$ vimdiff api.txt abi.txt # Or `comm -13 api.txt abi.txt'
Skenario lain yang berguna adalah menemukan simbol yang diekspor dari perpustakaan bersama paket Debian tetapi tidak dinyatakan dalam headernya. Alat utama untuk ini adalah skrip shlibvischeck-debian .
Untuk menerapkannya pada paket, jalankan
$ shlibvischeck-debian libacl1
The following exported symbols in package 'libacl1' are private:
__acl_extended_file
__acl_from_xattr
__acl_to_xattr
__bss_start
_edata
_end
_fini
_init
closed
head
high_water_alloc
next_line
num_dir_handles
walk_tree
Untuk melewatkan simbol autogenerasi seperti _init atau _edata (disebabkan oleh skrip linker LD dan file startup libgcc) tambahkan --permissive .
Anda juga dapat memeriksa masalah visibilitas di header dan perpustakaan sewenang -wenang:
$ shlibvischeck-common --permissive --cflags="-I/usr/include -I$AUDIT_INSTALL/include -I/usr/lib/llvm-5.0/lib/clang/5.0.0/include" $AUDIT_INSTALL/include/*.h $AUDIT_INSTALL/lib/*.so*
Prasyarat build-time adalah python3 (modul setuptools ), clang , llvm , libclang-dev , g++ dan make . Ketergantungan run-time adalah python3 (modul python-magic ), pkg-config dan aptitude . Untuk menginstal semuanya di Ubuntu, jalankan
$ sudo apt-get install python3 clang llvm libclang-dev g++ make pkg-config aptitude
$ sudo python3 -mensurepip
$ sudo pip3 install setuptools python-magic
(Anda juga dapat menggunakan scripts/install-deps.sh ).
Anda juga perlu mengaktifkan akses ke paket sumber Ubuntu melalui
$ sudo sed -Ei 's/^# *deb-src /deb-src /' /etc/apt/sources.list
$ sudo apt-get update
Komponen Python dan biner dibangun secara terpisah:
$ make clean all && make install
$ ./setup.py build && pip3 install .
Selama analisis shlibvischeck-debian menginstal paket debian baru sehingga disarankan untuk menjalankannya di bawah chroot atau di VM. Ada banyak instruksi tentang pengaturan chroot misalnya yang satu ini.
Daftar paket untuk analisis dapat diperoleh dari peringkat Debian:
$ curl https://popcon.debian.org/by_vote | awk '/^[0-9]+ +lib/{print $2}' > by_vote
$ shlibvischeck-debian $(head -500 by_vote | tr 'n' ' ')
Setelah Anda menemukan paket yang bermasalah, Anda dapat memperbaikinya dengan membatasi visibilitas simbol internal. Cara terbaik untuk mengontrol visibilitas simbol dalam suatu paket adalah dengan
-fvisibility=hidden ke CFLAGS dalam proyek buildscripts ( Makefile.in atau CMakeLists.txt )__attribute__((visibility("default")))Lihat Fix di Libcaca misalnya.
At The Moment Tool hanya berfungsi pada sistem berbasis Debian (misalnya Ubuntu). Ini harus baik -baik saja karena buildscript adalah sama di semua distro sehingga mendeteksi masalah pada Ubuntu juga akan melayani orang lain.
Masalah desain yang penting adalah bahwa alat ini tidak dapat mendeteksi simbol yang digunakan secara tidak langsung yaitu bukan melalui API tetapi melalui dlsym atau deklarasi prototipe out-of-header eksplisit dalam file sumber. Ini terjadi di plugin atau shlib yang saling berhubungan erat dalam proyek yang sama. Kasus -kasus seperti itu semoga jarang terjadi.
ShlibvisibilityChecker adalah alat heuristik sehingga tidak akan dapat menganalisis semua paket. Tingkat keberhasilan saat ini adalah sekitar 60%. Alasan utama kesalahan adalah
libatasmart gagal memasukkan stddef.h dan tdb gagal memasukkan sys/types.h ).lzma/container.h )dpkg/macros.h membutuhkan LIBDPKG_VOLATILE_API )libverto-dev menggunakan header glib tetapi tidak menyatakan ini)Masalah lain:
Alat ini menemukan sejumlah besar paket yang tidak memiliki anotasi visibilitas (dalam praktiknya setiap paket kedua memiliki ekspor palsu). Berikut adalah beberapa yang saya coba perbaiki:
Paket perspektif lebih banyak (dari Debian Top-100): libpopt1, libgpg-error0, libxml2, libwrap0, libpcre3, libkeyutils1, libedit2, liblcms2-2.