How do module directories get associated with specific installation locations of perl?
Easy: The library paths are compiled into the perl binary. In case of Linux, most of the library paths are actually in libperl.so, the perl executable is barely more than a stub that contains just enough code to load libperl.so, and the directory where libperl.so can be found:
/home/alex>cd /usr/bin/ /usr/bin>strings perl | grep /usr /usr/lib64/perl5/CORE /usr/bin>ldd perl linux-vdso.so.1 (0x00007ffe43ef0000) libperl.so => /usr/lib64/perl5/CORE/libperl.so (0x00007f2387f4 +3000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2387d26000) libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f2387b0c000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f2387908000) libm.so.6 => /lib64/libm.so.6 (0x00007f23875ff000) libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f23873c7000) libutil.so.1 => /lib64/libutil.so.1 (0x00007f23871c4000) libc.so.6 => /lib64/libc.so.6 (0x00007f2386dfb000) /lib64/ld-linux-x86-64.so.2 (0x00007f2388327000) /usr/bin>strings /usr/lib64/perl5/CORE/libperl.so | grep /usr /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 /usr/bin>./perl -E 'say for @INC' /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 . /usr/bin>ls -l perl perl5.22.2 lrwxrwxrwx 1 root root 10 Jan 8 2017 perl -> perl5.22.2* -rwxr-xr-x 1 root root 10376 Apr 30 2016 perl5.22.2* /usr/bin>
The CPAN utilities (or, to be more precise: the module build utilties) install into the directories that were choosen when perl was configured. That information is available via Config, and is actually stored in Config_heavy.pl:
/usr/bin>grep /usr /usr/lib64/perl5/Config_heavy.pl |grep perl archlib='/usr/lib64/perl5' archlibexp='/usr/lib64/perl5' ccdlflags='-Wl,-E -Wl,-rpath,/usr/lib64/perl5/CORE' config_arg10='-Dvendorarch=/usr/lib64/perl5/vendor_perl' config_arg4='-Dsitelib=/usr/local/share/perl5' config_arg5='-Dsitearch=/usr/local/lib64/perl5' config_arg6='-Darchlib=/usr/lib64/perl5' config_arg8='-Dprivlib=/usr/share/perl5' config_arg9='-Dvendorlib=/usr/share/perl5/vendor_perl' config_args='-de -Dprefix=/usr -Dsiteprefix=/usr/local -Dsitelib=/usr/ +local/share/perl5 -Dsitearch=/usr/local/lib64/perl5 -Darchlib=/usr/li +b64/perl5 -Dvendorprefix=/usr -Dprivlib=/usr/share/perl5 -Dvendorlib= +/usr/share/perl5/vendor_perl -Dvendorarch=/usr/lib64/perl5/vendor_per +l -Dscriptdir=/usr/bin -Dcccdlflags=-fPIC -Dinstallprefix=/usr -Dlibp +th=/usr/local/lib64 /usr/lib64 /lib64 -Doptimize=-O2 -fPIC -Dusethrea +ds -Duseithreads -Duseshrplib -Ubincompat5005 -Uversiononly -Dpager=/ +usr/bin/less -isr -Darchname=x86_64-linux' installarchlib='/usr/lib64/perl5' installprivlib='/usr/share/perl5' installsitearch='/usr/local/lib64/perl5' installsitelib='/usr/local/share/perl5' installvendorarch='/usr/lib64/perl5/vendor_perl' installvendorlib='/usr/share/perl5/vendor_perl' perlpath='/usr/bin/perl' privlib='/usr/share/perl5' privlibexp='/usr/share/perl5' sitearch='/usr/local/lib64/perl5' sitearchexp='/usr/local/lib64/perl5' sitelib='/usr/local/share/perl5' sitelib_stem='/usr/local/share/perl5' sitelibexp='/usr/local/share/perl5' startperl='#!/usr/bin/perl' vendorarch='/usr/lib64/perl5/vendor_perl' vendorarchexp='/usr/lib64/perl5/vendor_perl' vendorlib='/usr/share/perl5/vendor_perl' vendorlib_stem='/usr/share/perl5/vendor_perl' vendorlibexp='/usr/share/perl5/vendor_perl' /usr/bin>
The build modules simply load and query Config, simply by using use or require. Config.pm and Config_heavy.pl are created when perl is compiled, and installed into one of the directories compiled into the binaries. Because each perl has its own set of include directories, simply loading Config.pm is sufficient (unless someone has messed with @INC or the data in Config.pm or Config_heavy.pl - see the warning in Config).
(All examples from Slackware Linux 14.2 64 bit, using the system perl.)
Alexander
In reply to Re^5: Devel::NYTProf: "undefined symbol: PL_stack_sp" error
by afoken
in thread Devel::NYTProf: "undefined symbol: PL_stack_sp" error
by Special_K
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |