как проверить что модуль бинарный (чтото компилирует)

Oct 01, 2018 08:28


как проверить что модуль бинарный  (чтото компилирует ) ?

например мне нужны модули реализованые на perl без требований к компиляции -

как проверить что модуль не годится?

Leave a comment

zupernintendo October 3 2018, 10:23:14 UTC
задача проверить что пакет не использует бинарный код

к примеру модуль https://metacpan.org/source/DAGOLDEN/HTTP-Tiny-0.076/lib/HTTP/Tiny.pm

содержит код

# Need Net::SSLeay 1.49 for MODE_AUTO_RETRY
unless (eval {require Net::SSLeay; Net::SSLeay->VERSION(1.49)}) {
$ok = 0;
$reason .= qq/Net::SSLeay 1.49 must be installed for https support\n/;
}
иду в модуль netssleay который есть в списке requirements к модулю
вижу только в исходнике загрузку бинарного кода
больше нигде явно не указано это требование
eval {
require XSLoader;
XSLoader::load('Net::SSLeay', $VERSION);
1;
} or do {
require DynaLoader;
push @ISA, 'DynaLoader';
bootstrap Net::SSLeay $VERSION;
};

https://metacpan.org/source/MIKEM/Net-SSLeay-1.85/lib/Net/SSLeay.pm

регуляркой по исходникам проверять проверять и больше никак?

типа если есть XSLoader::load(' - значит модуль какие то бинарники грузит

Reply

ocehb October 3 2018, 11:04:04 UTC
Можно регуляркой.
А можно так:

# strace -e trace=openat perl -MHTTP::Tiny -le 'print $HTTP::Tiny::VERSION' |& grep -F .so
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libperl.so.5.26", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libresolv.so.2", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libcrypt.so.1", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libutil.so.1", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/usr/local/lib64/perl5/auto/IO/IO.so", O_RDONLY|O_CLOEXEC) = 7
openat(AT_FDCWD, "/usr/lib64/perl5/vendor_perl/auto/Socket/Socket.so", O_RDONLY|O_CLOEXEC) = 6
openat(AT_FDCWD, "/usr/lib64/perl5/auto/Fcntl/Fcntl.so", O_RDONLY|O_CLOEXEC) = 6
openat(AT_FDCWD, "/usr/lib64/perl5/auto/POSIX/POSIX.so", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/lib64/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 5

покажет, какие бинарные библиотеки подгружаются, SSLeay нет.
А вот если запустить

# strace -e trace=openat perl -MHTTP::Tiny -le 'print $HTTP::Tiny::VERSION; print HTTP::Tiny->new->can_ssl' |& grep SSLeay
openat(AT_FDCWD, "/usr/lib64/perl5/vendor_perl/Net/SSLeay.pm", O_RDONLY) = 4
openat(AT_FDCWD, "/usr/lib64/perl5/vendor_perl/auto/Net/SSLeay/autosplit.ix", O_RDONLY) = 5
openat(AT_FDCWD, "/usr/lib64/perl5/vendor_perl/auto/Net/SSLeay/SSLeay.so", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/usr/lib64/perl5/vendor_perl/auto/Net/SSLeay/randomize.al", O_RDONLY) = 3

увидим, что бинарную библиотеку подключили.

XSLoader::load может грузить, может не грузить, в зависимости от логики.
он может грузить и системны модули, которые всегда есть в дистрибутиве.

Reply


Leave a comment

Up