Linux::Smaps kernel/perlio dependencies

Linux::Smaps kernel/perlio dependencies

am 03.06.2008 11:04:00 von torsten.foertsch

Hi,

I have recently got a bug report about Linux::Smaps. The poster said it'd
report 2 [vdso] areas and that it can be cured if /proc/self/smaps is opened
with '<:stdio'. Later on he also found the behavior depends on the kernel
version, 2.6.25.3 shows 2 vdsos 2.6.23.1-21 only one.

Since I don't have any of these kernels I am asking for help. To all of my
knowledge multiple vdsos is nonsense. But is it a kernel bug or a bug in the
perlio layer?

Could you please run the following command on various combinations of linux
kernel and perlio?

PERLIO="stdio" perl -pe 'BEGIN {my $smaps="/proc/$$/smaps";
open STDIN, "<", $smaps or die "$!\n"; system "cat -n $smaps"}
$_="$.\t$_"' | grep vdso

It should print 2 almost identical lines. If there are more please report.

Here an example:

$ PERLIO="stdio" perl -pe 'BEGIN {my $smaps="/proc/$$/smaps"; open STDIN, "<", $smaps or die "$!\n"; system "cat -n $smaps"} $_="$.\t$_"'|grep vdso
321 ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
321 ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]

Keep in mind that /proc/$$/smaps exists only for kernels >=2.6.14.

Thanks,
Torsten

Re: Linux::Smaps kernel/perlio dependencies

am 03.06.2008 11:52:48 von aw

Hi.
I don't have a clue what this relates to, but just in case it helps for
your sample, here are the outputs for 2 Linux Debian systems (don't know
how to output the version of perlio though) :

1)
root@arthur:~# uname -a
Linux arthur 2.6.18-6-686 #1 SMP Thu May 8 07:34:27 UTC 2008 i686 GNU/Linux
root@arthur:~# PERLIO="stdio" perl -pe 'BEGIN {my
$smaps="/proc/$$/smaps"; open STDIN, "<", $smaps or die "$!\n"; system
"cat -n $smaps"} $_="$.\t$_"'|grep vdso"} $_="$.\t$_"'|grep vd
155 b7f92000-b7f93000 r-xp b7f92000 00:00 0
[vdso]
155 b7f92000-b7f93000 r-xp b7f92000 00:00 0 [vdso]
root@arthur:~# perl -V
Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
Platform:
osname=linux, osvers=2.6.24.4, archname=i486-linux-gnu-thread-multi
uname='linux ninsei 2.6.24.4 #1 smp preempt fri apr 18 15:36:09 pdt
2008 i686 gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN
-Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr
-Dprivlib=/usr/share/perl/5.8 -Darchlib=/usr/lib/perl/5.8
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5
-Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local
-Dsitelib=/usr/local/share/perl/5.8.8
-Dsitearch=/usr/local/lib/perl/5.8.8 -Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1
-Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl
-Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Uusesfio -Uusenm
-Duseshrplib -Dlibperl=libperl.so.5.8.8 -Dd_dosuid -des'
hint=recommended, useposix=true, d_sigaction=define
usethreads=define use5005threads=undef useithreads=define
usemultiplicity=define
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=undef use64bitall=undef uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS
-DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
optimize='-O2',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN
-fno-strict-aliasing -pipe -I/usr/local/include'
ccversion='', gccversion='4.1.2 20061115 (prerelease) (Debian
4.1.1-21)', gccosandvers=''
intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
alignbytes=4, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib
libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
perllibs=-ldl -lm -lpthread -lc -lcrypt
libc=/lib/libc-2.3.6.so, so=so, useshrplib=true,
libperl=libperl.so.5.8.8
gnulibc_version='2.3.6'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'


Characteristics of this binary (from libperl):
Compile-time options: MULTIPLICITY PERL_IMPLICIT_CONTEXT
PERL_MALLOC_WRAP THREADS_HAVE_PIDS USE_ITHREADS
USE_LARGE_FILES USE_PERLIO USE_REENTRANT_API
Built under linux
Compiled at Apr 25 2008 20:23:05
@INC:
/etc/perl
/usr/local/lib/perl/5.8.8
/usr/local/share/perl/5.8.8
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.8
/usr/share/perl/5.8
/usr/local/lib/site_perl
/usr/local/lib/perl/5.8.4
/usr/local/share/perl/5.8.4
.
root@arthur:~#

2)
dent:~# uname -a
Linux dent 2.6.18-6-xen-amd64 #1 SMP Thu May 8 08:34:37 UTC 2008 x86_64
GNU/Linux
dent:~# PERLIO="stdio" perl -pe 'BEGIN {my $smaps="/proc/$$/smaps"; open
STDIN, "<", $smaps or die "$!\n"; system "cat -n $smaps"}
$_="$.\t$_"'|grep vdso
232 ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0
[vdso]
232 ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0
[vdso]
dent:~# perl -V
Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
Platform:
osname=linux, osvers=2.6.24-1-amd64,
archname=x86_64-linux-gnu-thread-multi
uname='linux deneb 2.6.24-1-amd64 #1 smp thu mar 27 16:52:38 utc
2008 x86_64 gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN
-Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr
-Dprivlib=/usr/share/perl/5.8 -Darchlib=/usr/lib/perl/5.8
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5
-Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local
-Dsitelib=/usr/local/share/perl/5.8.8
-Dsitearch=/usr/local/lib/perl/5.8.8 -Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1
-Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl
-Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Uusesfio -Uusenm
-Duseshrplib -Dlibperl=libperl.so.5.8.8 -Dd_dosuid -des'
hint=recommended, useposix=true, d_sigaction=define
usethreads=define use5005threads=undef useithreads=define
usemultiplicity=define
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=define use64bitall=define uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS
-DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
optimize='-O2',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN
-fno-strict-aliasing -pipe -I/usr/local/include'
ccversion='', gccversion='4.1.2 20061115 (prerelease) (Debian
4.1.1-21)', gccosandvers=''
intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
alignbytes=8, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib
libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
perllibs=-ldl -lm -lpthread -lc -lcrypt
libc=/lib/libc-2.3.6.so, so=so, useshrplib=true,
libperl=libperl.so.5.8.8
gnulibc_version='2.3.6'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'


Characteristics of this binary (from libperl):
Compile-time options: MULTIPLICITY PERL_IMPLICIT_CONTEXT
PERL_MALLOC_WRAP THREADS_HAVE_PIDS USE_64_BIT_ALL
USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES
USE_PERLIO USE_REENTRANT_API
Built under linux
Compiled at Apr 25 2008 19:26:38
@INC:
/etc/perl
/usr/local/lib/perl/5.8.8
/usr/local/share/perl/5.8.8
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.8
/usr/share/perl/5.8
/usr/local/lib/site_perl
.
dent:~#


Torsten Foertsch wrote:
> Hi,
>
> I have recently got a bug report about Linux::Smaps. The poster said it'd
> report 2 [vdso] areas and that it can be cured if /proc/self/smaps is opened
> with '<:stdio'. Later on he also found the behavior depends on the kernel
> version, 2.6.25.3 shows 2 vdsos 2.6.23.1-21 only one.
>
> Since I don't have any of these kernels I am asking for help. To all of my
> knowledge multiple vdsos is nonsense. But is it a kernel bug or a bug in the
> perlio layer?
>
> Could you please run the following command on various combinations of linux
> kernel and perlio?
>
> PERLIO="stdio" perl -pe 'BEGIN {my $smaps="/proc/$$/smaps";
> open STDIN, "<", $smaps or die "$!\n"; system "cat -n $smaps"}
> $_="$.\t$_"' | grep vdso
>
> It should print 2 almost identical lines. If there are more please report.
>
> Here an example:
>
> $ PERLIO="stdio" perl -pe 'BEGIN {my $smaps="/proc/$$/smaps"; open STDIN, "<", $smaps or die "$!\n"; system "cat -n $smaps"} $_="$.\t$_"'|grep vdso
> 321 ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
> 321 ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
>
> Keep in mind that /proc/$$/smaps exists only for kernels >=2.6.14.
>
> Thanks,
> Torsten
>

Re: Linux::Smaps kernel/perlio dependencies

am 03.06.2008 13:20:51 von John Peacock

Torsten Foertsch wrote:
> PERLIO="stdio" perl -pe 'BEGIN {my $smaps="/proc/$$/smaps";
> open STDIN, "<", $smaps or die "$!\n"; system "cat -n $smaps"}
> $_="$.\t$_"' | grep vdso

Since Merijn already did 2.6.16/18/22, (which I've confirmed on my boxes),
here's 2.6.25:

Linux localhost.localdomain 2.6.25.3-18.fc9.i686 #1 SMP Tue May 13 05:38:53 EDT
2008 i686 i686 i386 GNU/Linux

perl, v5.10.0 built for i386-linux-thread-multi

PERLIO="stdio" perl -pe 'BEGIN {my $smaps="/proc/$$/smaps";
> open STDIN, "<", $smaps or die "$!\n"; system "cat -n $smaps"}
> $_="$.\t$_"' | grep vdso
1 00110000-00111000 r-xp 00110000 00:00 0 [vdso]
1 00110000-00111000 r-xp 00110000 00:00 0 [vdso]



HTH

John

Re: Linux::Smaps kernel/perlio dependencies

am 03.06.2008 15:20:24 von torsten.foertsch

On Tue 03 Jun 2008, Torsten Foertsch wrote:
> Could you please run the following command on various combinations of lin=
ux
> kernel and perlio?
>
> PERLIO=3D"stdio" perl -pe 'BEGIN {my $smaps=3D"/proc/$$/smaps";
> =A0 open STDIN, "<", $smaps or die "$!\n"; system "cat -n $smaps"}
> =A0 $_=3D"$.\t$_"' | grep vdso

Thanks to all so far. But could you please try that command for PERLIO=3Dpe=
rlio=20
and perhaps PERLIO=3Dunix too?

Thanks,
Torsten

=2D-
Need professional mod_perl support?
Just hire me: torsten.foertsch@gmx.net

Re: Linux::Smaps kernel/perlio dependencies

am 03.06.2008 16:28:02 von mpeters

Torsten Foertsch wrote:

> It should print 2 almost identical lines. If there are more please report.

Perl 5.8.8 and Linux 2.6.20 only prints 2.

--
Michael Peters
Plus Three, LP

Re: Linux::Smaps kernel/perlio dependencies

am 03.06.2008 17:11:57 von aw

Torsten Foertsch wrote:
> On Tue 03 Jun 2008, Torsten Foertsch wrote:
[...]
> Thanks to all so far. But could you please try that command for PERLIO=perlio
> and perhaps PERLIO=unix too?
>

Here you go.
I find it interesting that the answers are all different on system (1),
but all the same on system (2).
I don't have a clue as to what it means, or what it does to my systems,
but I trust you do.

1)
root@arthur:~# uname -a
Linux arthur 2.6.18-6-686 #1 SMP Thu May 8 07:34:27 UTC 2008 i686 GNU/Linux
root@arthur:~# perl -V
Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
Platform:
osname=linux, osvers=2.6.24.4, archname=i486-linux-gnu-thread-multi
uname='linux ninsei 2.6.24.4 #1 smp preempt fri apr 18 15:36:09 pdt
2008 i686 gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN
-Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr
-Dprivlib=/usr/share/perl/5.8 -Darchlib=/usr/lib/perl/5.8
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5
-Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local
-Dsitelib=/usr/local/share/perl/5.8.8
-Dsitearch=/usr/local/lib/perl/5.8.8 -Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1
-Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl
-Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Uusesfio -Uusenm
-Duseshrplib -Dlibperl=libperl.so.5.8.8 -Dd_dosuid -des'
hint=recommended, useposix=true, d_sigaction=define
usethreads=define use5005threads=undef useithreads=define
usemultiplicity=define
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=undef use64bitall=undef uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS
-DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
optimize='-O2',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN
-fno-strict-aliasing -pipe -I/usr/local/include'
ccversion='', gccversion='4.1.2 20061115 (prerelease) (Debian
4.1.1-21)', gccosandvers=''
intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
alignbytes=4, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib
libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
perllibs=-ldl -lm -lpthread -lc -lcrypt
libc=/lib/libc-2.3.6.so, so=so, useshrplib=true,
libperl=libperl.so.5.8.8
gnulibc_version='2.3.6'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'


Characteristics of this binary (from libperl):
Compile-time options: MULTIPLICITY PERL_IMPLICIT_CONTEXT
PERL_MALLOC_WRAP THREADS_HAVE_PIDS USE_ITHREADS
USE_LARGE_FILES USE_PERLIO USE_REENTRANT_API
Built under linux
Compiled at Apr 25 2008 20:23:05
@INC:
/etc/perl
/usr/local/lib/perl/5.8.8
/usr/local/share/perl/5.8.8
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.8
/usr/share/perl/5.8
/usr/local/lib/site_perl
/usr/local/lib/perl/5.8.4
/usr/local/share/perl/5.8.4
.
root@arthur:~# PERLIO="unix" perl -pe 'BEGIN {my
$smaps="/proc/$$/smaps"; open STDIN, "<", $smaps or die "$!\n"; system
"cat -n $smaps"} $_="$.\t$_"'|grep vdso
155 b7ef6000-b7ef7000 r-xp b7ef6000 00:00 0 [vdso]
155 b7ef6000-b7ef7000 r-xp b7ef6000 00:00 0 [vdso]
root@arthur:~# PERLIO="perlio" perl -pe 'BEGIN {my
$smaps="/proc/$$/smaps"; open STDIN, "<", $smaps or die "$!\n"; system
"cat -n $smaps"} $_="$.\t$_"'|grep vdso
155 b7fb5000-b7fb6000 r-xp b7fb5000 00:00 0 [vdso]
155 b7fb5000-b7fb6000 r-xp b7fb5000 00:00 0 [vdso]
root@arthur:~# PERLIO="stdio" perl -pe 'BEGIN {my
$smaps="/proc/$$/smaps"; open STDIN, "<", $smaps or die "$!\n"; system
"cat -n $smaps"} $_="$.\t$_"'|grep vdso
155 b7f30000-b7f31000 r-xp b7f30000 00:00 0 [vdso]
155 b7f30000-b7f31000 r-xp b7f30000 00:00 0 [vdso]
root@arthur:~#


2)
dent:~# uname -a
Linux dent 2.6.18-6-xen-amd64 #1 SMP Thu May 8 08:34:37 UTC 2008 x86_64
GNU/Linux
dent:~# perl -V
Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
Platform:
osname=linux, osvers=2.6.24-1-amd64,
archname=x86_64-linux-gnu-thread-multi
uname='linux deneb 2.6.24-1-amd64 #1 smp thu mar 27 16:52:38 utc
2008 x86_64 gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN
-Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr
-Dprivlib=/usr/share/perl/5.8 -Darchlib=/usr/lib/perl/5.8
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5
-Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local
-Dsitelib=/usr/local/share/perl/5.8.8
-Dsitearch=/usr/local/lib/perl/5.8.8 -Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1
-Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl
-Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Uusesfio -Uusenm
-Duseshrplib -Dlibperl=libperl.so.5.8.8 -Dd_dosuid -des'
hint=recommended, useposix=true, d_sigaction=define
usethreads=define use5005threads=undef useithreads=define
usemultiplicity=define
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=define use64bitall=define uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS
-DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
optimize='-O2',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN
-fno-strict-aliasing -pipe -I/usr/local/include'
ccversion='', gccversion='4.1.2 20061115 (prerelease) (Debian
4.1.1-21)', gccosandvers=''
intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
alignbytes=8, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib
libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
perllibs=-ldl -lm -lpthread -lc -lcrypt
libc=/lib/libc-2.3.6.so, so=so, useshrplib=true,
libperl=libperl.so.5.8.8
gnulibc_version='2.3.6'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'


Characteristics of this binary (from libperl):
Compile-time options: MULTIPLICITY PERL_IMPLICIT_CONTEXT
PERL_MALLOC_WRAP THREADS_HAVE_PIDS USE_64_BIT_ALL
USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES
USE_PERLIO USE_REENTRANT_API
Built under linux
Compiled at Apr 25 2008 19:26:38
@INC:
/etc/perl
/usr/local/lib/perl/5.8.8
/usr/local/share/perl/5.8.8
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.8
/usr/share/perl/5.8
/usr/local/lib/site_perl
.
dent:~# PERLIO="unix" perl -pe 'BEGIN {my $smaps="/proc/$$/smaps"; open
STDIN, "<", $smaps or die "$!\n"; system "cat -n $smaps"}
$_="$.\t$_"'|grep vdso
232 ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0
[vdso]
232 ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0
[vdso]
dent:~# PERLIO="perlio" perl -pe 'BEGIN {my $smaps="/proc/$$/smaps";
open STDIN, "<", $smaps or die "$!\n"; system "cat -n $smaps"}
$_="$.\t$_"'|grep vdso
232 ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0
[vdso]
232 ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0
[vdso]
dent:~# PERLIO="stdio" perl -pe 'BEGIN {my $smaps="/proc/$$/smaps"; open
STDIN, "<", $smaps or die "$!\n"; system "cat -n $smaps"}
$_="$.\t$_"'|grep vdso
232 ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0
[vdso]
232 ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0
[vdso]
dent:~#

André

Re: Linux::Smaps kernel/perlio dependencies

am 03.06.2008 18:48:21 von torsten.foertsch

On Tue 03 Jun 2008, Andr=E9 Warnier wrote:
> I find it interesting that the answers are all different on system (1),
> but all the same on system (2).
> I don't have a clue as to what it means, or what it does to my systems,
> but I trust you do.

Just to enlighten you. Originally linux on x86 used to use a software=20
interrupt 0x80 to implement syscalls. With newer processors this is a=20
performance bottleneck. So a new interface (sysenter/sysexit) has been=20
invented to switch from user space to kernel space and back.

This new interface uses a special page that is mapped in the virtual addres=
s=20
space of each process the so called Virtual Dynamic Shared Object (vdso). I=
t=20
was originally located at a well known place in the address space of a=20
process because the C library needs to know where it is to make syscalls.

Later on it was found that the exact place where in the address space the v=
dso=20
page is located can be randomized a bit to enhance security. That makes it=
=20
harder to perform attacks based on shell code injection or other things whe=
re=20
the attacker needs to perform syscalls. But on the downside you need a glib=
c=20
that knows how to locate that page itself. So older programs won't run on a=
=20
system that randomizes the vdso location.

So, what you see on "arthur" is a randomized vdso location and on "dent" a=
=20
fixed one.

Torsten

=2D-
Need professional mod_perl support?
Just hire me: torsten.foertsch@gmx.net

Re: Linux::Smaps kernel/perlio dependencies

am 03.06.2008 21:43:30 von aw

Torsten,

many thanks for the time taken for the explanation.

I still understand only slightly less than 50% of it, but then I don't
really need to understand more either. I am just very glad and thankful
that there are people such as you who apparently do understand it, upon
which we can rely to give us a good perl when we need it, a good
explanation when we ask for it, and upon which we might need to call
some day when we are really desperate.

And, one other good thing about the explanation below, is that it will
undoubtedly provide a number of people like me with some esoteric new
vocabulary for the next time the marketing guys ask us why this damn
project isn't ready in time. I can just see their faces when we talk to
them about boosting performance and avoiding shell code injection by
taking advantage of the latest processors and glibc features, and now
switching from user to supervisor mode by means of a Virtual Dynamic
Shared Object instead of the old passé software interrupt 0x80.
Great stuff !

Now if I could just understand why the different choices of a perlio
layer influence the location of this VDSO, I feel that I would instantly
become a much better perl and mod_perl programmer. Or was it just the
fact that I ran the command 3 times in a row ? Hmmm.
But don't ! I really do not need to know about that one.

Danke und Grüsse
André

P.S. Now that I knew what to look for, there seems to be a good
explanation here :
http://manugarg.googlepages.com/systemcallinlinux2_6.html
Now I feel that my understanding has climbed to at least 55%.


Torsten Foertsch wrote:
> On Tue 03 Jun 2008, André Warnier wrote:
>> I find it interesting that the answers are all different on system (1),
>> but all the same on system (2).
>> I don't have a clue as to what it means, or what it does to my systems,
>> but I trust you do.
>
> Just to enlighten you. Originally linux on x86 used to use a software
> interrupt 0x80 to implement syscalls. With newer processors this is a
> performance bottleneck. So a new interface (sysenter/sysexit) has been
> invented to switch from user space to kernel space and back.
>
> This new interface uses a special page that is mapped in the virtual address
> space of each process the so called Virtual Dynamic Shared Object (vdso). It
> was originally located at a well known place in the address space of a
> process because the C library needs to know where it is to make syscalls.
>
> Later on it was found that the exact place where in the address space the vdso
> page is located can be randomized a bit to enhance security. That makes it
> harder to perform attacks based on shell code injection or other things where
> the attacker needs to perform syscalls. But on the downside you need a glibc
> that knows how to locate that page itself. So older programs won't run on a
> system that randomizes the vdso location.
>
> So, what you see on "arthur" is a randomized vdso location and on "dent" a
> fixed one.
>
> Torsten
>
> --
> Need professional mod_perl support?
> Just hire me: torsten.foertsch@gmx.net
>