Dpkg
view release on metacpan or search on metacpan
t/Dpkg_Shlibs.t view on Meta::CPAN
my $name = shift;
my $obj = Dpkg::Shlibs::Objdump::Object->new();
open my $objdump, '<', "$datadir/objdump.$name"
or die "$datadir/objdump.$name: $!";
$obj->parse_objdump_output($objdump);
close $objdump;
return $obj;
}
my @librarypaths;
{
# XXX: Keep as long as we support the deprecated LD_LIBRARY_PATH.
local $ENV{LD_LIBRARY_PATH} = '/test-env';
Dpkg::Shlibs::add_library_dir('/test-a');
@librarypaths = Dpkg::Shlibs::get_library_paths();
is($librarypaths[0], '/test-a', 'add_library_dir() does not get lost');
Dpkg::Shlibs::add_library_dir('/test-b');
@librarypaths = Dpkg::Shlibs::get_library_paths();
is_deeply([ @librarypaths[0, 1] ] , [ '/test-a', '/test-b' ],
'add_library_dir() prepends');
}
Dpkg::Shlibs::blank_library_paths();
# We want relative paths inside the ld.so.conf fragments to work, and $srcdir
# is usually a relative path, so let us temporarily switch directory.
# XXX: An alternative would be to make parse_ldso_conf relative path aware.
my $cwd = getcwd();
test_chdir_srcdir();
Dpkg::Shlibs::parse_ldso_conf('t/Dpkg_Shlibs/ld.so.conf');
chdir($cwd);
@librarypaths = Dpkg::Shlibs::get_library_paths();
is_deeply(\@librarypaths, [ qw(
/nonexistent32
/nonexistent/lib64
/usr/local/lib
/nonexistent/lib128
) ],
'parsed library paths');
## Test Dpkg::Shlibs::Objdump module.
my $obj;
$obj = load_objdump_obj('dbd-pg');
ok(! $obj->is_public_library(), 'Pg.so is not a public library');
ok(! $obj->is_executable(), 'Pg.so is not an executable');
$obj = load_objdump_obj('ls');
ok(! $obj->is_public_library(), 'ls is not a public library');
ok($obj->is_executable(), 'ls is an executable');
my $sym = $obj->get_symbol('optarg@GLIBC_2.0');
ok($sym, 'optarg@GLIBC_2.0 exists');
ok(! $sym->{defined}, 'R_*_COPY relocations are taken into account');
# Non-regression test for #506139.
$obj = load_objdump_obj('space');
$sym = $obj->get_symbol('singlespace');
ok($sym, 'version less symbol separated by a single space are correctly parsed');
$obj = load_objdump_obj('libc6-2.6');
ok($obj->is_public_library(), 'libc6 is a public library');
ok($obj->is_executable(), 'libc6 is an executable');
is($obj->{SONAME}, 'libc.so.6', 'SONAME');
is($obj->{HASH}, '0x13d99c', 'HASH');
is($obj->{GNU_HASH}, '0x194', 'GNU_HASH');
is($obj->{format}, 'elf32-i386', 'format');
is_deeply($obj->{flags},
{
DYNAMIC => 1,
HAS_SYMS => 1,
D_PAGED => 1,
},
'flags',
);
is_deeply($obj->{NEEDED}, [ 'ld-linux.so.2' ], 'NEEDED');
is_deeply([ $obj->get_needed_libraries ], [ 'ld-linux.so.2' ], 'NEEDED');
$sym = $obj->get_symbol('_sys_nerr@GLIBC_2.3');
is_deeply($sym,
{
name => '_sys_nerr',
version => 'GLIBC_2.3',
soname => 'libc.so.6',
objid => 'libc.so.6',
section => '.rodata',
dynamic => 1,
debug => '',
type => 'O',
weak => '',
local => '',
global => 1,
visibility => '',
hidden => 1,
defined => 1,
},
'Symbol');
$sym = $obj->get_symbol('_IO_stdin_used');
is_deeply($sym,
{
name => '_IO_stdin_used',
version => '',
soname => 'libc.so.6',
objid => 'libc.so.6',
section => '*UND*',
dynamic => 1,
debug => '',
type => ' ',
weak => 1,
local => '',
global => '',
visibility => '',
hidden => '',
( run in 1.238 second using v1.01-cache-2.11-cpan-71847e10f99 )