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

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

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

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.