shlibvisibilitychecker هي أداة صغيرة تحدد الرموز الداخلية التي يتم تصديرها بشكل غير ضروري من المكتبات المشتركة. مثل هذه الرموز غير مرغوب فيها لأنها تسبب
--gc-sections ) يقارن ShlibvisibilityChecker واجهات برمجة التطبيقات المعلنة في الرؤوس العامة ضد واجهات برمجة التطبيقات التي تم تصديرها من المكتبات المشتركة وتحذر من التناقضات. في معظم الحالات ، تكون هذه الرموز هي رموز مكتبة داخلية يجب إخفاؤها (في حالات نادرة ، هذه الرموز الداخلية التي تستخدمها المكتبات أو التنفيذيين الأخرى في نفس الحزمة ويحاول shlibvischeck-debian صعوبة في الإبلاغ عن هذه الحالات).
يجب بعد ذلك إصلاح هذه التناقضات عن طريق إعادة تجميع الحزمة مع -fvisibility=hidden (انظر هنا للحصول على التفاصيل). يمكن العثور على إصلاح نموذجي ، لمشروع AutoconF النموذجي هنا.
لا يُقصد من shlibvisibilitychecker أن يكون دقيقًا بنسبة 100 ٪ ، بل يقدم المساعدة في تحديد موقع الحزم التي قد تستفيد أكثر من التعليقات التوضيحية الرؤية (وفهم مدى سوء الوضع مع الرؤية في التوزيعات الحديثة).
للتحقق من حزمة خام ، أي مجموعة من الرؤوس و libs المشتركة ، وجمع واجهات المصدر والثنائية ومقارنتها:
$ 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'
سيناريو مفيد آخر هو تحديد موقع الرموز التي يتم تصديرها من مكتبات Debian Package المشتركة ولكن لم يتم الإعلان عنها في رؤوسها. الأداة الرئيسية لهذا هو البرنامج النصي shlibvischeck-debian .
لتطبيقها على الحزمة ، قم بتشغيلها
$ 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
لتخطي الرموز المتمثلة في تلقائيات مثل _init أو _edata (الناتجة عن البرامج النصية LD Linker وملفات بدء التشغيل LIBGCC) إضافة --permissive .
يمكنك أيضًا التحقق من مشكلات الرؤية في مجموعة من الرؤوس والمكتبات التعسفية:
$ 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*
المتطلبات المسبقة للوقت هي python3 (وحدة setuptools ) ، clang ، llvm ، libclang-dev ، g++ و make . تبعيات وقت التشغيل هي python3 (وحدة python-magic ) ، pkg-config aptitude . لتثبيت كل شيء على Ubuntu ، قم بتشغيل
$ sudo apt-get install python3 clang llvm libclang-dev g++ make pkg-config aptitude
$ sudo python3 -mensurepip
$ sudo pip3 install setuptools python-magic
(يمكنك أيضًا استخدام scripts/install-deps.sh ).
تحتاج أيضًا إلى تمكين الوصول إلى حزم مصدر Ubuntu عبر
$ sudo sed -Ei 's/^# *deb-src /deb-src /' /etc/apt/sources.list
$ sudo apt-get update
يتم بناء المكونات الثنائية والثنائية بشكل منفصل:
$ make clean all && make install
$ ./setup.py build && pip3 install .
أثناء التحليل ، يقوم shlibvischeck-debian بتثبيت حزم Debian جديدة ، لذا يوصى بتشغيله تحت chroot أو في VM. هناك العديد من الإرشادات حول إعداد chroot على سبيل المثال هذا.
يمكن الحصول على قائمة من الحزم للتحليل من تصنيف Debian:
$ curl https://popcon.debian.org/by_vote | awk '/^[0-9]+ +lib/{print $2}' > by_vote
$ shlibvischeck-debian $(head -500 by_vote | tr 'n' ' ')
بمجرد العثور على حزمة إشكالية ، يمكنك إصلاحها عن طريق تقييد رؤية الرموز الداخلية. أفضل طريقة للتحكم في رؤية الرمز في الحزمة
-fvisibility=hidden في CFLAGS في Buildscripts ( Makefile.in أو CMakeLists.txt )__attribute__((visibility("default")))انظر الإصلاح في libcaca على سبيل المثال.
في الوقت الحالي ، تعمل Tool فقط على الأنظمة المستندة إلى Debian (على سبيل المثال Ubuntu). يجب أن يكون هذا جيدًا لأن BuildScripts متماثل في جميع التوزيعات ، لذا فإن اكتشاف المشكلات على Ubuntu سيخدم الجميع أيضًا.
تكمن مشكلة التصميم المهمة في أن الأداة لا يمكنها اكتشاف الرموز التي يتم استخدامها بشكل غير مباشر ، أي ليس من خلال واجهة برمجة التطبيقات dlsym أو إعلان النموذج الأولي الصريح في الملف في الملف المصدر. يحدث هذا في المكونات الإضافية أو shlibs مترابطة بإحكام داخل نفس المشروع. يجب أن تكون مثل هذه الحالات نادرة.
shlibvisibilitychecker هي أداة إرشادية لذلك لن تكون قادرة على تحليل جميع الحزم. معدل النجاح الحالي حوالي 60 ٪. الأسباب الرئيسية للأخطاء
libatasmart في تضمين stddef.h و tdb فشل في تضمين sys/types.h ).lzma/container.h )dpkg/macros.h يتطلب LIBDPKG_VOLATILE_API )libverto-dev رؤوس GLIB ولكنه لا يعلن هذا)قضايا أخرى:
وجدت الأداة عددًا كبيرًا من الحزم التي تفتقر إلى شرح الرؤية (في الممارسة العملية ، كل حزمة ثانية لها صادرات زائفة). إليكم البعض الذي حاولت إصلاحه:
المزيد من حزم المنظور (من Debian Top-100): libpopt1 ، libgpg-error0 ، libxml2 ، libwrap0 ، libpcre3 ، libkeyutils1 ، libedit2 ، liblcms2-2.